{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [],
   "source": [
    "%load_ext autoreload\n",
    "%autoreload 2\n",
    "%matplotlib inline\n",
    "%config InlineBackend.figure_format = 'retina'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# `pyjanitor`: Clean APIs for cleaning data\n",
    "\n",
    "Eric J. Ma\n",
    "\n",
    "SciPy 2019"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Hello 👋👋"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [],
   "source": [
    "username = \"ericmjl\"\n",
    "twitter = f\"@{username}\"\n",
    "website = f\"{username}.github.io\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Twitter: @ericmjl\n",
      "Website: ericmjl.github.io\n"
     ]
    }
   ],
   "source": [
    "print(f\"Twitter: {twitter}\")\n",
    "print(f\"Website: {website}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Wrangling data takes time\n",
    "\n",
    "What fraction of time do *you* spend on data cleaning?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Wrangling messy data can sometimes mean messy code"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>First Name</th>\n",
       "      <th>Last Name</th>\n",
       "      <th>Employee Status</th>\n",
       "      <th>Subject</th>\n",
       "      <th>Hire Date</th>\n",
       "      <th>% Allocated</th>\n",
       "      <th>Full time?</th>\n",
       "      <th>do not edit! ---&gt;</th>\n",
       "      <th>Certification</th>\n",
       "      <th>Certification.1</th>\n",
       "      <th>Certification.2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Jason</td>\n",
       "      <td>Bourne</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>PE</td>\n",
       "      <td>39690.0</td>\n",
       "      <td>0.75</td>\n",
       "      <td>Yes</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Physical ed</td>\n",
       "      <td>Theater</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Jason</td>\n",
       "      <td>Bourne</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Drafting</td>\n",
       "      <td>39690.0</td>\n",
       "      <td>0.25</td>\n",
       "      <td>Yes</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Physical ed</td>\n",
       "      <td>Theater</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Alicia</td>\n",
       "      <td>Keys</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Music</td>\n",
       "      <td>37118.0</td>\n",
       "      <td>1.00</td>\n",
       "      <td>Yes</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Instr. music</td>\n",
       "      <td>Vocal music</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Ada</td>\n",
       "      <td>Lovelace</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>NaN</td>\n",
       "      <td>27515.0</td>\n",
       "      <td>1.00</td>\n",
       "      <td>Yes</td>\n",
       "      <td>NaN</td>\n",
       "      <td>PENDING</td>\n",
       "      <td>Computers</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Desus</td>\n",
       "      <td>Nice</td>\n",
       "      <td>Administration</td>\n",
       "      <td>Dean</td>\n",
       "      <td>41431.0</td>\n",
       "      <td>1.00</td>\n",
       "      <td>Yes</td>\n",
       "      <td>NaN</td>\n",
       "      <td>PENDING</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Chien-Shiung</td>\n",
       "      <td>Wu</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Physics</td>\n",
       "      <td>11037.0</td>\n",
       "      <td>0.50</td>\n",
       "      <td>Yes</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Science 6-12</td>\n",
       "      <td>Physics</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>Chien-Shiung</td>\n",
       "      <td>Wu</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Chemistry</td>\n",
       "      <td>11037.0</td>\n",
       "      <td>0.50</td>\n",
       "      <td>Yes</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Science 6-12</td>\n",
       "      <td>Physics</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>James</td>\n",
       "      <td>Joyce</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>English</td>\n",
       "      <td>32994.0</td>\n",
       "      <td>0.50</td>\n",
       "      <td>No</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>English 6-12</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>Hedy</td>\n",
       "      <td>Lamarr</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Science</td>\n",
       "      <td>27919.0</td>\n",
       "      <td>0.50</td>\n",
       "      <td>No</td>\n",
       "      <td>NaN</td>\n",
       "      <td>PENDING</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>Carlos</td>\n",
       "      <td>Boozer</td>\n",
       "      <td>Coach</td>\n",
       "      <td>Basketball</td>\n",
       "      <td>42221.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>No</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Physical ed</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>Young</td>\n",
       "      <td>Boozer</td>\n",
       "      <td>Coach</td>\n",
       "      <td>NaN</td>\n",
       "      <td>34700.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>No</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Political sci.</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>Micheal</td>\n",
       "      <td>Larsen</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>English</td>\n",
       "      <td>40071.0</td>\n",
       "      <td>0.80</td>\n",
       "      <td>No</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Vocal music</td>\n",
       "      <td>English</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      First Name Last Name Employee Status     Subject  Hire Date  \\\n",
       "0          Jason    Bourne         Teacher          PE    39690.0   \n",
       "1          Jason    Bourne         Teacher    Drafting    39690.0   \n",
       "2         Alicia      Keys         Teacher       Music    37118.0   \n",
       "3            Ada  Lovelace         Teacher         NaN    27515.0   \n",
       "4          Desus      Nice  Administration        Dean    41431.0   \n",
       "5   Chien-Shiung        Wu         Teacher     Physics    11037.0   \n",
       "6   Chien-Shiung        Wu         Teacher   Chemistry    11037.0   \n",
       "7            NaN       NaN             NaN         NaN        NaN   \n",
       "8          James     Joyce         Teacher     English    32994.0   \n",
       "9           Hedy    Lamarr         Teacher     Science    27919.0   \n",
       "10        Carlos    Boozer           Coach  Basketball    42221.0   \n",
       "11         Young    Boozer           Coach         NaN    34700.0   \n",
       "12       Micheal    Larsen         Teacher     English    40071.0   \n",
       "\n",
       "    % Allocated Full time?  do not edit! ---> Certification Certification.1  \\\n",
       "0          0.75        Yes                NaN   Physical ed         Theater   \n",
       "1          0.25        Yes                NaN   Physical ed         Theater   \n",
       "2          1.00        Yes                NaN  Instr. music     Vocal music   \n",
       "3          1.00        Yes                NaN       PENDING       Computers   \n",
       "4          1.00        Yes                NaN       PENDING             NaN   \n",
       "5          0.50        Yes                NaN  Science 6-12         Physics   \n",
       "6          0.50        Yes                NaN  Science 6-12         Physics   \n",
       "7           NaN        NaN                NaN           NaN             NaN   \n",
       "8          0.50         No                NaN           NaN    English 6-12   \n",
       "9          0.50         No                NaN       PENDING             NaN   \n",
       "10          NaN         No                NaN   Physical ed             NaN   \n",
       "11          NaN         No                NaN           NaN  Political sci.   \n",
       "12         0.80         No                NaN   Vocal music         English   \n",
       "\n",
       "    Certification.2  \n",
       "0               NaN  \n",
       "1               NaN  \n",
       "2               NaN  \n",
       "3               NaN  \n",
       "4               NaN  \n",
       "5               NaN  \n",
       "6               NaN  \n",
       "7               NaN  \n",
       "8               NaN  \n",
       "9               NaN  \n",
       "10              NaN  \n",
       "11              NaN  \n",
       "12              NaN  "
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "from pyprojroot import here\n",
    "\n",
    "df = pd.read_excel(here() / \"examples/notebooks/dirty_data.xlsx\")\n",
    "df\n",
    "\n",
    "# First problem: empty columns and rows"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>First Name</th>\n",
       "      <th>Last Name</th>\n",
       "      <th>Employee Status</th>\n",
       "      <th>Subject</th>\n",
       "      <th>Hire Date</th>\n",
       "      <th>% Allocated</th>\n",
       "      <th>Full time?</th>\n",
       "      <th>Certification</th>\n",
       "      <th>Certification.1</th>\n",
       "      <th>Certification.2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Jason</td>\n",
       "      <td>Bourne</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>PE</td>\n",
       "      <td>39690.0</td>\n",
       "      <td>0.75</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Physical ed</td>\n",
       "      <td>Theater</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Jason</td>\n",
       "      <td>Bourne</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Drafting</td>\n",
       "      <td>39690.0</td>\n",
       "      <td>0.25</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Physical ed</td>\n",
       "      <td>Theater</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Alicia</td>\n",
       "      <td>Keys</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Music</td>\n",
       "      <td>37118.0</td>\n",
       "      <td>1.00</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Instr. music</td>\n",
       "      <td>Vocal music</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Ada</td>\n",
       "      <td>Lovelace</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>NaN</td>\n",
       "      <td>27515.0</td>\n",
       "      <td>1.00</td>\n",
       "      <td>Yes</td>\n",
       "      <td>PENDING</td>\n",
       "      <td>Computers</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Desus</td>\n",
       "      <td>Nice</td>\n",
       "      <td>Administration</td>\n",
       "      <td>Dean</td>\n",
       "      <td>41431.0</td>\n",
       "      <td>1.00</td>\n",
       "      <td>Yes</td>\n",
       "      <td>PENDING</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Chien-Shiung</td>\n",
       "      <td>Wu</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Physics</td>\n",
       "      <td>11037.0</td>\n",
       "      <td>0.50</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Science 6-12</td>\n",
       "      <td>Physics</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>Chien-Shiung</td>\n",
       "      <td>Wu</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Chemistry</td>\n",
       "      <td>11037.0</td>\n",
       "      <td>0.50</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Science 6-12</td>\n",
       "      <td>Physics</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>James</td>\n",
       "      <td>Joyce</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>English</td>\n",
       "      <td>32994.0</td>\n",
       "      <td>0.50</td>\n",
       "      <td>No</td>\n",
       "      <td>NaN</td>\n",
       "      <td>English 6-12</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>Hedy</td>\n",
       "      <td>Lamarr</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Science</td>\n",
       "      <td>27919.0</td>\n",
       "      <td>0.50</td>\n",
       "      <td>No</td>\n",
       "      <td>PENDING</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>Carlos</td>\n",
       "      <td>Boozer</td>\n",
       "      <td>Coach</td>\n",
       "      <td>Basketball</td>\n",
       "      <td>42221.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>No</td>\n",
       "      <td>Physical ed</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>Young</td>\n",
       "      <td>Boozer</td>\n",
       "      <td>Coach</td>\n",
       "      <td>NaN</td>\n",
       "      <td>34700.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>No</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Political sci.</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>Micheal</td>\n",
       "      <td>Larsen</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>English</td>\n",
       "      <td>40071.0</td>\n",
       "      <td>0.80</td>\n",
       "      <td>No</td>\n",
       "      <td>Vocal music</td>\n",
       "      <td>English</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      First Name Last Name Employee Status     Subject  Hire Date  \\\n",
       "0          Jason    Bourne         Teacher          PE    39690.0   \n",
       "1          Jason    Bourne         Teacher    Drafting    39690.0   \n",
       "2         Alicia      Keys         Teacher       Music    37118.0   \n",
       "3            Ada  Lovelace         Teacher         NaN    27515.0   \n",
       "4          Desus      Nice  Administration        Dean    41431.0   \n",
       "5   Chien-Shiung        Wu         Teacher     Physics    11037.0   \n",
       "6   Chien-Shiung        Wu         Teacher   Chemistry    11037.0   \n",
       "8          James     Joyce         Teacher     English    32994.0   \n",
       "9           Hedy    Lamarr         Teacher     Science    27919.0   \n",
       "10        Carlos    Boozer           Coach  Basketball    42221.0   \n",
       "11         Young    Boozer           Coach         NaN    34700.0   \n",
       "12       Micheal    Larsen         Teacher     English    40071.0   \n",
       "\n",
       "    % Allocated Full time? Certification Certification.1  Certification.2  \n",
       "0          0.75        Yes   Physical ed         Theater              NaN  \n",
       "1          0.25        Yes   Physical ed         Theater              NaN  \n",
       "2          1.00        Yes  Instr. music     Vocal music              NaN  \n",
       "3          1.00        Yes       PENDING       Computers              NaN  \n",
       "4          1.00        Yes       PENDING             NaN              NaN  \n",
       "5          0.50        Yes  Science 6-12         Physics              NaN  \n",
       "6          0.50        Yes  Science 6-12         Physics              NaN  \n",
       "8          0.50         No           NaN    English 6-12              NaN  \n",
       "9          0.50         No       PENDING             NaN              NaN  \n",
       "10          NaN         No   Physical ed             NaN              NaN  \n",
       "11          NaN         No           NaN  Political sci.              NaN  \n",
       "12         0.80         No   Vocal music         English              NaN  "
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Remove the empty column and empty row\n",
    "df = df.drop(\"do not edit! --->\", axis=1).drop(7, axis=0)\n",
    "df\n",
    "\n",
    "# Next problem: columns are not standardized"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>first_name</th>\n",
       "      <th>last_name</th>\n",
       "      <th>employee_status</th>\n",
       "      <th>subject</th>\n",
       "      <th>hire_date</th>\n",
       "      <th>percentage_allocated</th>\n",
       "      <th>is_full_time</th>\n",
       "      <th>certification</th>\n",
       "      <th>Certification.1</th>\n",
       "      <th>Certification.2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Jason</td>\n",
       "      <td>Bourne</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>PE</td>\n",
       "      <td>39690.0</td>\n",
       "      <td>0.75</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Physical ed</td>\n",
       "      <td>Theater</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Jason</td>\n",
       "      <td>Bourne</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Drafting</td>\n",
       "      <td>39690.0</td>\n",
       "      <td>0.25</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Physical ed</td>\n",
       "      <td>Theater</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Alicia</td>\n",
       "      <td>Keys</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Music</td>\n",
       "      <td>37118.0</td>\n",
       "      <td>1.00</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Instr. music</td>\n",
       "      <td>Vocal music</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Ada</td>\n",
       "      <td>Lovelace</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>NaN</td>\n",
       "      <td>27515.0</td>\n",
       "      <td>1.00</td>\n",
       "      <td>Yes</td>\n",
       "      <td>PENDING</td>\n",
       "      <td>Computers</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Desus</td>\n",
       "      <td>Nice</td>\n",
       "      <td>Administration</td>\n",
       "      <td>Dean</td>\n",
       "      <td>41431.0</td>\n",
       "      <td>1.00</td>\n",
       "      <td>Yes</td>\n",
       "      <td>PENDING</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Chien-Shiung</td>\n",
       "      <td>Wu</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Physics</td>\n",
       "      <td>11037.0</td>\n",
       "      <td>0.50</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Science 6-12</td>\n",
       "      <td>Physics</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>Chien-Shiung</td>\n",
       "      <td>Wu</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Chemistry</td>\n",
       "      <td>11037.0</td>\n",
       "      <td>0.50</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Science 6-12</td>\n",
       "      <td>Physics</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>James</td>\n",
       "      <td>Joyce</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>English</td>\n",
       "      <td>32994.0</td>\n",
       "      <td>0.50</td>\n",
       "      <td>No</td>\n",
       "      <td>NaN</td>\n",
       "      <td>English 6-12</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>Hedy</td>\n",
       "      <td>Lamarr</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Science</td>\n",
       "      <td>27919.0</td>\n",
       "      <td>0.50</td>\n",
       "      <td>No</td>\n",
       "      <td>PENDING</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>Carlos</td>\n",
       "      <td>Boozer</td>\n",
       "      <td>Coach</td>\n",
       "      <td>Basketball</td>\n",
       "      <td>42221.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>No</td>\n",
       "      <td>Physical ed</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>Young</td>\n",
       "      <td>Boozer</td>\n",
       "      <td>Coach</td>\n",
       "      <td>NaN</td>\n",
       "      <td>34700.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>No</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Political sci.</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>Micheal</td>\n",
       "      <td>Larsen</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>English</td>\n",
       "      <td>40071.0</td>\n",
       "      <td>0.80</td>\n",
       "      <td>No</td>\n",
       "      <td>Vocal music</td>\n",
       "      <td>English</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      first_name last_name employee_status     subject  hire_date  \\\n",
       "0          Jason    Bourne         Teacher          PE    39690.0   \n",
       "1          Jason    Bourne         Teacher    Drafting    39690.0   \n",
       "2         Alicia      Keys         Teacher       Music    37118.0   \n",
       "3            Ada  Lovelace         Teacher         NaN    27515.0   \n",
       "4          Desus      Nice  Administration        Dean    41431.0   \n",
       "5   Chien-Shiung        Wu         Teacher     Physics    11037.0   \n",
       "6   Chien-Shiung        Wu         Teacher   Chemistry    11037.0   \n",
       "8          James     Joyce         Teacher     English    32994.0   \n",
       "9           Hedy    Lamarr         Teacher     Science    27919.0   \n",
       "10        Carlos    Boozer           Coach  Basketball    42221.0   \n",
       "11         Young    Boozer           Coach         NaN    34700.0   \n",
       "12       Micheal    Larsen         Teacher     English    40071.0   \n",
       "\n",
       "    percentage_allocated is_full_time certification Certification.1  \\\n",
       "0                   0.75          Yes   Physical ed         Theater   \n",
       "1                   0.25          Yes   Physical ed         Theater   \n",
       "2                   1.00          Yes  Instr. music     Vocal music   \n",
       "3                   1.00          Yes       PENDING       Computers   \n",
       "4                   1.00          Yes       PENDING             NaN   \n",
       "5                   0.50          Yes  Science 6-12         Physics   \n",
       "6                   0.50          Yes  Science 6-12         Physics   \n",
       "8                   0.50           No           NaN    English 6-12   \n",
       "9                   0.50           No       PENDING             NaN   \n",
       "10                   NaN           No   Physical ed             NaN   \n",
       "11                   NaN           No           NaN  Political sci.   \n",
       "12                  0.80           No   Vocal music         English   \n",
       "\n",
       "    Certification.2  \n",
       "0               NaN  \n",
       "1               NaN  \n",
       "2               NaN  \n",
       "3               NaN  \n",
       "4               NaN  \n",
       "5               NaN  \n",
       "6               NaN  \n",
       "8               NaN  \n",
       "9               NaN  \n",
       "10              NaN  \n",
       "11              NaN  \n",
       "12              NaN  "
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Rename columns to something nicer.\n",
    "df = df.rename(\n",
    "    mapper={\n",
    "        \"First Name\": \"first_name\",\n",
    "        \"Last Name\": \"last_name\",\n",
    "        \"Employee Status\": \"employee_status\",\n",
    "        \"Subject\": \"subject\",\n",
    "        \"Hire Date\": \"hire_date\",\n",
    "        \"% Allocated\": \"percentage_allocated\",\n",
    "        \"Full time?\": \"is_full_time\",\n",
    "        \"Certification\": \"certification\",\n",
    "    },\n",
    "    axis=1,\n",
    ")\n",
    "df\n",
    "\n",
    "# Next problem: hire date?!?! Certifications?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>first_name</th>\n",
       "      <th>last_name</th>\n",
       "      <th>employee_status</th>\n",
       "      <th>subject</th>\n",
       "      <th>hire_date</th>\n",
       "      <th>percentage_allocated</th>\n",
       "      <th>is_full_time</th>\n",
       "      <th>certification</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Jason</td>\n",
       "      <td>Bourne</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>PE</td>\n",
       "      <td>2008-08-30</td>\n",
       "      <td>0.75</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Physical ed</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Jason</td>\n",
       "      <td>Bourne</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Drafting</td>\n",
       "      <td>2008-08-30</td>\n",
       "      <td>0.25</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Physical ed</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Alicia</td>\n",
       "      <td>Keys</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Music</td>\n",
       "      <td>2001-08-15</td>\n",
       "      <td>1.00</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Instr. music</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Ada</td>\n",
       "      <td>Lovelace</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1975-05-01</td>\n",
       "      <td>1.00</td>\n",
       "      <td>Yes</td>\n",
       "      <td>PENDING</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Desus</td>\n",
       "      <td>Nice</td>\n",
       "      <td>Administration</td>\n",
       "      <td>Dean</td>\n",
       "      <td>2013-06-06</td>\n",
       "      <td>1.00</td>\n",
       "      <td>Yes</td>\n",
       "      <td>PENDING</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Chien-Shiung</td>\n",
       "      <td>Wu</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Physics</td>\n",
       "      <td>1930-03-20</td>\n",
       "      <td>0.50</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Science 6-12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>Chien-Shiung</td>\n",
       "      <td>Wu</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Chemistry</td>\n",
       "      <td>1930-03-20</td>\n",
       "      <td>0.50</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Science 6-12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>James</td>\n",
       "      <td>Joyce</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>English</td>\n",
       "      <td>1990-05-01</td>\n",
       "      <td>0.50</td>\n",
       "      <td>No</td>\n",
       "      <td>English 6-12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>Hedy</td>\n",
       "      <td>Lamarr</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Science</td>\n",
       "      <td>1976-06-08</td>\n",
       "      <td>0.50</td>\n",
       "      <td>No</td>\n",
       "      <td>PENDING</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>Carlos</td>\n",
       "      <td>Boozer</td>\n",
       "      <td>Coach</td>\n",
       "      <td>Basketball</td>\n",
       "      <td>2015-08-05</td>\n",
       "      <td>NaN</td>\n",
       "      <td>No</td>\n",
       "      <td>Physical ed</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>Young</td>\n",
       "      <td>Boozer</td>\n",
       "      <td>Coach</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1995-01-01</td>\n",
       "      <td>NaN</td>\n",
       "      <td>No</td>\n",
       "      <td>Political sci.</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>Micheal</td>\n",
       "      <td>Larsen</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>English</td>\n",
       "      <td>2009-09-15</td>\n",
       "      <td>0.80</td>\n",
       "      <td>No</td>\n",
       "      <td>Vocal music</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      first_name last_name employee_status     subject  hire_date  \\\n",
       "0          Jason    Bourne         Teacher          PE 2008-08-30   \n",
       "1          Jason    Bourne         Teacher    Drafting 2008-08-30   \n",
       "2         Alicia      Keys         Teacher       Music 2001-08-15   \n",
       "3            Ada  Lovelace         Teacher         NaN 1975-05-01   \n",
       "4          Desus      Nice  Administration        Dean 2013-06-06   \n",
       "5   Chien-Shiung        Wu         Teacher     Physics 1930-03-20   \n",
       "6   Chien-Shiung        Wu         Teacher   Chemistry 1930-03-20   \n",
       "8          James     Joyce         Teacher     English 1990-05-01   \n",
       "9           Hedy    Lamarr         Teacher     Science 1976-06-08   \n",
       "10        Carlos    Boozer           Coach  Basketball 2015-08-05   \n",
       "11         Young    Boozer           Coach         NaN 1995-01-01   \n",
       "12       Micheal    Larsen         Teacher     English 2009-09-15   \n",
       "\n",
       "    percentage_allocated is_full_time   certification  \n",
       "0                   0.75          Yes     Physical ed  \n",
       "1                   0.25          Yes     Physical ed  \n",
       "2                   1.00          Yes    Instr. music  \n",
       "3                   1.00          Yes         PENDING  \n",
       "4                   1.00          Yes         PENDING  \n",
       "5                   0.50          Yes    Science 6-12  \n",
       "6                   0.50          Yes    Science 6-12  \n",
       "8                   0.50           No    English 6-12  \n",
       "9                   0.50           No         PENDING  \n",
       "10                   NaN           No     Physical ed  \n",
       "11                   NaN           No  Political sci.  \n",
       "12                  0.80           No     Vocal music  "
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import datetime as dt\n",
    "\n",
    "# Get the \"hire date\" into shape.\n",
    "df[\"hire_date\"] = pd.TimedeltaIndex(df[\"hire_date\"], unit=\"d\") + dt.datetime(\n",
    "    1899, 12, 30\n",
    ")\n",
    "\n",
    "# Those certification columns don't look particularly good.\n",
    "# Should just have one of them.\n",
    "df[\"certification\"] = df[\"certification\"].combine_first(df[\"Certification.1\"])\n",
    "df = df.drop([\"Certification.1\", \"Certification.2\"], axis=1)\n",
    "df\n",
    "\n",
    "# Next problem: Missing a column"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>first_name</th>\n",
       "      <th>last_name</th>\n",
       "      <th>employee_status</th>\n",
       "      <th>subject</th>\n",
       "      <th>hire_date</th>\n",
       "      <th>percentage_allocated</th>\n",
       "      <th>is_full_time</th>\n",
       "      <th>certification</th>\n",
       "      <th>gratitude_points</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Jason</td>\n",
       "      <td>Bourne</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>PE</td>\n",
       "      <td>2008-08-30</td>\n",
       "      <td>0.75</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Physical ed</td>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Jason</td>\n",
       "      <td>Bourne</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Drafting</td>\n",
       "      <td>2008-08-30</td>\n",
       "      <td>0.25</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Physical ed</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Alicia</td>\n",
       "      <td>Keys</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Music</td>\n",
       "      <td>2001-08-15</td>\n",
       "      <td>1.00</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Instr. music</td>\n",
       "      <td>20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Ada</td>\n",
       "      <td>Lovelace</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1975-05-01</td>\n",
       "      <td>1.00</td>\n",
       "      <td>Yes</td>\n",
       "      <td>PENDING</td>\n",
       "      <td>1000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Desus</td>\n",
       "      <td>Nice</td>\n",
       "      <td>Administration</td>\n",
       "      <td>Dean</td>\n",
       "      <td>2013-06-06</td>\n",
       "      <td>1.00</td>\n",
       "      <td>Yes</td>\n",
       "      <td>PENDING</td>\n",
       "      <td>392</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Chien-Shiung</td>\n",
       "      <td>Wu</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Physics</td>\n",
       "      <td>1930-03-20</td>\n",
       "      <td>0.50</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Science 6-12</td>\n",
       "      <td>115</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>Chien-Shiung</td>\n",
       "      <td>Wu</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Chemistry</td>\n",
       "      <td>1930-03-20</td>\n",
       "      <td>0.50</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Science 6-12</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>James</td>\n",
       "      <td>Joyce</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>English</td>\n",
       "      <td>1990-05-01</td>\n",
       "      <td>0.50</td>\n",
       "      <td>No</td>\n",
       "      <td>English 6-12</td>\n",
       "      <td>182</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>Hedy</td>\n",
       "      <td>Lamarr</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Science</td>\n",
       "      <td>1976-06-08</td>\n",
       "      <td>0.50</td>\n",
       "      <td>No</td>\n",
       "      <td>PENDING</td>\n",
       "      <td>1190</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>Carlos</td>\n",
       "      <td>Boozer</td>\n",
       "      <td>Coach</td>\n",
       "      <td>Basketball</td>\n",
       "      <td>2015-08-05</td>\n",
       "      <td>NaN</td>\n",
       "      <td>No</td>\n",
       "      <td>Physical ed</td>\n",
       "      <td>582</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>Young</td>\n",
       "      <td>Boozer</td>\n",
       "      <td>Coach</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1995-01-01</td>\n",
       "      <td>NaN</td>\n",
       "      <td>No</td>\n",
       "      <td>Political sci.</td>\n",
       "      <td>25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>Micheal</td>\n",
       "      <td>Larsen</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>English</td>\n",
       "      <td>2009-09-15</td>\n",
       "      <td>0.80</td>\n",
       "      <td>No</td>\n",
       "      <td>Vocal music</td>\n",
       "      <td>317</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      first_name last_name employee_status     subject  hire_date  \\\n",
       "0          Jason    Bourne         Teacher          PE 2008-08-30   \n",
       "1          Jason    Bourne         Teacher    Drafting 2008-08-30   \n",
       "2         Alicia      Keys         Teacher       Music 2001-08-15   \n",
       "3            Ada  Lovelace         Teacher         NaN 1975-05-01   \n",
       "4          Desus      Nice  Administration        Dean 2013-06-06   \n",
       "5   Chien-Shiung        Wu         Teacher     Physics 1930-03-20   \n",
       "6   Chien-Shiung        Wu         Teacher   Chemistry 1930-03-20   \n",
       "8          James     Joyce         Teacher     English 1990-05-01   \n",
       "9           Hedy    Lamarr         Teacher     Science 1976-06-08   \n",
       "10        Carlos    Boozer           Coach  Basketball 2015-08-05   \n",
       "11         Young    Boozer           Coach         NaN 1995-01-01   \n",
       "12       Micheal    Larsen         Teacher     English 2009-09-15   \n",
       "\n",
       "    percentage_allocated is_full_time   certification  gratitude_points  \n",
       "0                   0.75          Yes     Physical ed                10  \n",
       "1                   0.25          Yes     Physical ed                50  \n",
       "2                   1.00          Yes    Instr. music                20  \n",
       "3                   1.00          Yes         PENDING              1000  \n",
       "4                   1.00          Yes         PENDING               392  \n",
       "5                   0.50          Yes    Science 6-12               115  \n",
       "6                   0.50          Yes    Science 6-12                12  \n",
       "8                   0.50           No    English 6-12               182  \n",
       "9                   0.50           No         PENDING              1190  \n",
       "10                   NaN           No     Physical ed               582  \n",
       "11                   NaN           No  Political sci.                25  \n",
       "12                  0.80           No     Vocal music               317  "
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Add a column for \"gratitude points\"\n",
    "# given by students to the teachers.\n",
    "\n",
    "gratitude_points = [10, 50, 20, 1000, 392, 115, 12, 182, 1190, 582, 25, 317]\n",
    "\n",
    "df = df.assign(gratitude_points=gratitude_points)\n",
    "\n",
    "df\n",
    "\n",
    "# Next problem: Might want to log-transform."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>first_name</th>\n",
       "      <th>last_name</th>\n",
       "      <th>employee_status</th>\n",
       "      <th>subject</th>\n",
       "      <th>hire_date</th>\n",
       "      <th>percentage_allocated</th>\n",
       "      <th>is_full_time</th>\n",
       "      <th>certification</th>\n",
       "      <th>gratitude_points</th>\n",
       "      <th>gratitude_points_log</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Jason</td>\n",
       "      <td>Bourne</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>PE</td>\n",
       "      <td>2008-08-30</td>\n",
       "      <td>0.75</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Physical ed</td>\n",
       "      <td>10</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Jason</td>\n",
       "      <td>Bourne</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Drafting</td>\n",
       "      <td>2008-08-30</td>\n",
       "      <td>0.25</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Physical ed</td>\n",
       "      <td>50</td>\n",
       "      <td>1.698970</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Alicia</td>\n",
       "      <td>Keys</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Music</td>\n",
       "      <td>2001-08-15</td>\n",
       "      <td>1.00</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Instr. music</td>\n",
       "      <td>20</td>\n",
       "      <td>1.301030</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Ada</td>\n",
       "      <td>Lovelace</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1975-05-01</td>\n",
       "      <td>1.00</td>\n",
       "      <td>Yes</td>\n",
       "      <td>PENDING</td>\n",
       "      <td>1000</td>\n",
       "      <td>3.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Desus</td>\n",
       "      <td>Nice</td>\n",
       "      <td>Administration</td>\n",
       "      <td>Dean</td>\n",
       "      <td>2013-06-06</td>\n",
       "      <td>1.00</td>\n",
       "      <td>Yes</td>\n",
       "      <td>PENDING</td>\n",
       "      <td>392</td>\n",
       "      <td>2.593286</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Chien-Shiung</td>\n",
       "      <td>Wu</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Physics</td>\n",
       "      <td>1930-03-20</td>\n",
       "      <td>0.50</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Science 6-12</td>\n",
       "      <td>115</td>\n",
       "      <td>2.060698</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>Chien-Shiung</td>\n",
       "      <td>Wu</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Chemistry</td>\n",
       "      <td>1930-03-20</td>\n",
       "      <td>0.50</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Science 6-12</td>\n",
       "      <td>12</td>\n",
       "      <td>1.079181</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>James</td>\n",
       "      <td>Joyce</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>English</td>\n",
       "      <td>1990-05-01</td>\n",
       "      <td>0.50</td>\n",
       "      <td>No</td>\n",
       "      <td>English 6-12</td>\n",
       "      <td>182</td>\n",
       "      <td>2.260071</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>Hedy</td>\n",
       "      <td>Lamarr</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Science</td>\n",
       "      <td>1976-06-08</td>\n",
       "      <td>0.50</td>\n",
       "      <td>No</td>\n",
       "      <td>PENDING</td>\n",
       "      <td>1190</td>\n",
       "      <td>3.075547</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>Carlos</td>\n",
       "      <td>Boozer</td>\n",
       "      <td>Coach</td>\n",
       "      <td>Basketball</td>\n",
       "      <td>2015-08-05</td>\n",
       "      <td>NaN</td>\n",
       "      <td>No</td>\n",
       "      <td>Physical ed</td>\n",
       "      <td>582</td>\n",
       "      <td>2.764923</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>Young</td>\n",
       "      <td>Boozer</td>\n",
       "      <td>Coach</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1995-01-01</td>\n",
       "      <td>NaN</td>\n",
       "      <td>No</td>\n",
       "      <td>Political sci.</td>\n",
       "      <td>25</td>\n",
       "      <td>1.397940</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>Micheal</td>\n",
       "      <td>Larsen</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>English</td>\n",
       "      <td>2009-09-15</td>\n",
       "      <td>0.80</td>\n",
       "      <td>No</td>\n",
       "      <td>Vocal music</td>\n",
       "      <td>317</td>\n",
       "      <td>2.501059</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      first_name last_name employee_status     subject  hire_date  \\\n",
       "0          Jason    Bourne         Teacher          PE 2008-08-30   \n",
       "1          Jason    Bourne         Teacher    Drafting 2008-08-30   \n",
       "2         Alicia      Keys         Teacher       Music 2001-08-15   \n",
       "3            Ada  Lovelace         Teacher         NaN 1975-05-01   \n",
       "4          Desus      Nice  Administration        Dean 2013-06-06   \n",
       "5   Chien-Shiung        Wu         Teacher     Physics 1930-03-20   \n",
       "6   Chien-Shiung        Wu         Teacher   Chemistry 1930-03-20   \n",
       "8          James     Joyce         Teacher     English 1990-05-01   \n",
       "9           Hedy    Lamarr         Teacher     Science 1976-06-08   \n",
       "10        Carlos    Boozer           Coach  Basketball 2015-08-05   \n",
       "11         Young    Boozer           Coach         NaN 1995-01-01   \n",
       "12       Micheal    Larsen         Teacher     English 2009-09-15   \n",
       "\n",
       "    percentage_allocated is_full_time   certification  gratitude_points  \\\n",
       "0                   0.75          Yes     Physical ed                10   \n",
       "1                   0.25          Yes     Physical ed                50   \n",
       "2                   1.00          Yes    Instr. music                20   \n",
       "3                   1.00          Yes         PENDING              1000   \n",
       "4                   1.00          Yes         PENDING               392   \n",
       "5                   0.50          Yes    Science 6-12               115   \n",
       "6                   0.50          Yes    Science 6-12                12   \n",
       "8                   0.50           No    English 6-12               182   \n",
       "9                   0.50           No         PENDING              1190   \n",
       "10                   NaN           No     Physical ed               582   \n",
       "11                   NaN           No  Political sci.                25   \n",
       "12                  0.80           No     Vocal music               317   \n",
       "\n",
       "    gratitude_points_log  \n",
       "0               1.000000  \n",
       "1               1.698970  \n",
       "2               1.301030  \n",
       "3               3.000000  \n",
       "4               2.593286  \n",
       "5               2.060698  \n",
       "6               1.079181  \n",
       "8               2.260071  \n",
       "9               3.075547  \n",
       "10              2.764923  \n",
       "11              1.397940  \n",
       "12              2.501059  "
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "# Finally, log10 transform the gratitude_points column.\n",
    "\n",
    "df[\"gratitude_points_log\"] = df[\"gratitude_points\"].apply(np.log10)\n",
    "\n",
    "df\n",
    "\n",
    "# So what does this code look like in totality?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [],
   "source": [
    "df = (\n",
    "    pd.read_excel(\"../../examples/notebooks/dirty_data.xlsx\")\n",
    "    # Remove the empty column and empty row\n",
    "    .drop(\"do not edit! --->\", axis=1)\n",
    "    .drop(7, axis=0)\n",
    "    .rename(\n",
    "        mapper={\n",
    "            \"First Name\": \"first_name\",\n",
    "            \"Last Name\": \"last_name\",\n",
    "            \"Employee Status\": \"employee_status\",\n",
    "            \"Subject\": \"subject\",\n",
    "            \"Hire Date\": \"hire_date\",\n",
    "            \"% Allocated\": \"percentage_allocated\",\n",
    "            \"Full time?\": \"full_time\",\n",
    "            \"Certification\": \"certification\",\n",
    "        },\n",
    "        axis=1,\n",
    "    )\n",
    ")\n",
    "# Correct hire date.\n",
    "df[\"hire_date\"] = pd.TimedeltaIndex(df[\"hire_date\"], unit=\"d\") + dt.datetime(\n",
    "    1899, 12, 30\n",
    ")\n",
    "# Squash certification columns\n",
    "df[\"certification\"] = df[\"certification\"].combine_first(df[\"Certification.1\"])\n",
    "df = (\n",
    "    df.drop([\"Certification.1\", \"Certification.2\"], axis=1)\n",
    "    # Add gratidude points.\n",
    "    .assign(gratitude_points=gratitude_points)\n",
    ")\n",
    "# Log-transform gratitude points.\n",
    "df[\"gratitude_points_log\"] = df[\"gratitude_points\"].apply(np.log10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Key Issues"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "- `pandas` community idioms are a mix of *imperative* and *fluent* (method-chaining) styles: **we need to standardize interface**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "- Repetitive, long chunks of code, but they do perform defined tasks: **refactor into functions**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# There must be a better way\n",
    "\n",
    "(Raymond Hettinger)\n",
    "\n",
    "![](https://i.kym-cdn.com/entries/icons/original/000/022/488/c6bf9b08586c241b021dd04c204b7a85.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [],
   "source": [
    "# Yes, the import name is \"janitor\",\n",
    "# but the package is \"pyjanitor\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "With `pyjanitor`, we can now write code that looks like this:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>first_name</th>\n",
       "      <th>last_name</th>\n",
       "      <th>employee_status</th>\n",
       "      <th>subject</th>\n",
       "      <th>hire_date</th>\n",
       "      <th>percent_allocated</th>\n",
       "      <th>full_time</th>\n",
       "      <th>certification</th>\n",
       "      <th>gratitude_points</th>\n",
       "      <th>gratitude_log</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Jason</td>\n",
       "      <td>Bourne</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>PE</td>\n",
       "      <td>2008-08-30</td>\n",
       "      <td>0.75</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Physical ed</td>\n",
       "      <td>10</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Jason</td>\n",
       "      <td>Bourne</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Drafting</td>\n",
       "      <td>2008-08-30</td>\n",
       "      <td>0.25</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Physical ed</td>\n",
       "      <td>50</td>\n",
       "      <td>1.698970</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Alicia</td>\n",
       "      <td>Keys</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Music</td>\n",
       "      <td>2001-08-15</td>\n",
       "      <td>1.00</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Instr. music</td>\n",
       "      <td>20</td>\n",
       "      <td>1.301030</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Ada</td>\n",
       "      <td>Lovelace</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1975-05-01</td>\n",
       "      <td>1.00</td>\n",
       "      <td>Yes</td>\n",
       "      <td>PENDING</td>\n",
       "      <td>1000</td>\n",
       "      <td>3.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Desus</td>\n",
       "      <td>Nice</td>\n",
       "      <td>Administration</td>\n",
       "      <td>Dean</td>\n",
       "      <td>2013-06-06</td>\n",
       "      <td>1.00</td>\n",
       "      <td>Yes</td>\n",
       "      <td>PENDING</td>\n",
       "      <td>392</td>\n",
       "      <td>2.593286</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Chien-Shiung</td>\n",
       "      <td>Wu</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Physics</td>\n",
       "      <td>1930-03-20</td>\n",
       "      <td>0.50</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Science 6-12</td>\n",
       "      <td>115</td>\n",
       "      <td>2.060698</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>Chien-Shiung</td>\n",
       "      <td>Wu</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Chemistry</td>\n",
       "      <td>1930-03-20</td>\n",
       "      <td>0.50</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Science 6-12</td>\n",
       "      <td>12</td>\n",
       "      <td>1.079181</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>James</td>\n",
       "      <td>Joyce</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>English</td>\n",
       "      <td>1990-05-01</td>\n",
       "      <td>0.50</td>\n",
       "      <td>No</td>\n",
       "      <td>English 6-12</td>\n",
       "      <td>182</td>\n",
       "      <td>2.260071</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>Hedy</td>\n",
       "      <td>Lamarr</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Science</td>\n",
       "      <td>1976-06-08</td>\n",
       "      <td>0.50</td>\n",
       "      <td>No</td>\n",
       "      <td>PENDING</td>\n",
       "      <td>1190</td>\n",
       "      <td>3.075547</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>Carlos</td>\n",
       "      <td>Boozer</td>\n",
       "      <td>Coach</td>\n",
       "      <td>Basketball</td>\n",
       "      <td>2015-08-05</td>\n",
       "      <td>NaN</td>\n",
       "      <td>No</td>\n",
       "      <td>Physical ed</td>\n",
       "      <td>582</td>\n",
       "      <td>2.764923</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>Young</td>\n",
       "      <td>Boozer</td>\n",
       "      <td>Coach</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1995-01-01</td>\n",
       "      <td>NaN</td>\n",
       "      <td>No</td>\n",
       "      <td>Political sci.</td>\n",
       "      <td>25</td>\n",
       "      <td>1.397940</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>Micheal</td>\n",
       "      <td>Larsen</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>English</td>\n",
       "      <td>2009-09-15</td>\n",
       "      <td>0.80</td>\n",
       "      <td>No</td>\n",
       "      <td>Vocal music</td>\n",
       "      <td>317</td>\n",
       "      <td>2.501059</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      first_name last_name employee_status     subject  hire_date  \\\n",
       "0          Jason    Bourne         Teacher          PE 2008-08-30   \n",
       "1          Jason    Bourne         Teacher    Drafting 2008-08-30   \n",
       "2         Alicia      Keys         Teacher       Music 2001-08-15   \n",
       "3            Ada  Lovelace         Teacher         NaN 1975-05-01   \n",
       "4          Desus      Nice  Administration        Dean 2013-06-06   \n",
       "5   Chien-Shiung        Wu         Teacher     Physics 1930-03-20   \n",
       "6   Chien-Shiung        Wu         Teacher   Chemistry 1930-03-20   \n",
       "7          James     Joyce         Teacher     English 1990-05-01   \n",
       "8           Hedy    Lamarr         Teacher     Science 1976-06-08   \n",
       "9         Carlos    Boozer           Coach  Basketball 2015-08-05   \n",
       "10         Young    Boozer           Coach         NaN 1995-01-01   \n",
       "11       Micheal    Larsen         Teacher     English 2009-09-15   \n",
       "\n",
       "    percent_allocated full_time   certification  gratitude_points  \\\n",
       "0                0.75       Yes     Physical ed                10   \n",
       "1                0.25       Yes     Physical ed                50   \n",
       "2                1.00       Yes    Instr. music                20   \n",
       "3                1.00       Yes         PENDING              1000   \n",
       "4                1.00       Yes         PENDING               392   \n",
       "5                0.50       Yes    Science 6-12               115   \n",
       "6                0.50       Yes    Science 6-12                12   \n",
       "7                0.50        No    English 6-12               182   \n",
       "8                0.50        No         PENDING              1190   \n",
       "9                 NaN        No     Physical ed               582   \n",
       "10                NaN        No  Political sci.                25   \n",
       "11               0.80        No     Vocal music               317   \n",
       "\n",
       "    gratitude_log  \n",
       "0        1.000000  \n",
       "1        1.698970  \n",
       "2        1.301030  \n",
       "3        3.000000  \n",
       "4        2.593286  \n",
       "5        2.060698  \n",
       "6        1.079181  \n",
       "7        2.260071  \n",
       "8        3.075547  \n",
       "9        2.764923  \n",
       "10       1.397940  \n",
       "11       2.501059  "
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = (\n",
    "    pd.read_excel(\"../../examples/notebooks/dirty_data.xlsx\")\n",
    "    .remove_empty()\n",
    "    .clean_names(strip_underscores=True)\n",
    "    .coalesce([\"certification\", \"certification_1\"])\n",
    "    .convert_excel_date(\"hire_date\")\n",
    "    .rename_column(\"%_allocated\", \"percent_allocated\")\n",
    "    .add_column(\"gratitude_points\", gratitude_points)\n",
    "    .transform_column(\"gratitude_points\", np.log10, \"gratitude_log\")\n",
    ")\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Key Points\n",
    "\n",
    "- Don't replace `pandas` API.\n",
    "- Behave as if native `pandas` API."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "![](https://i.kym-cdn.com/entries/icons/original/000/029/717/sorcery.jpg)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "![](https://thumbs.dreamstime.com/z/vector-illustration-panda-sitting-ground-cherry-flavor-doughnut-donut-bagel-neck-vector-illustration-cute-119482695.jpg)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## `pandas-flavor`\n",
    "\n",
    "\"The easy way to write your own flavor of Pandas\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Design Requirements\n",
    "\n",
    "1. Accept a dataframe as first argument.\n",
    "1. Makes necessary modifications.\n",
    "1. Returns the modified dataframe.\n",
    "\n",
    "```python\n",
    "@pf.register_dataframe_method\n",
    "def my_func(df, *args, **kwargs):\n",
    "    # code that changes dataframe\n",
    "    return df\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "With better docstrings + tests, this could become part of `pyjanitor`!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [],
   "source": [
    "from functools import partial\n",
    "\n",
    "import pandas_flavor as pf\n",
    "\n",
    "\n",
    "@pf.register_dataframe_method\n",
    "def log_transform(df, column_name, base, dest_column_name=None):\n",
    "    \"\"\"\n",
    "    Log-transforms the supplied column.\n",
    "    \"\"\"\n",
    "\n",
    "    def _log_base(x, base):\n",
    "        return np.log10(x) / np.log10(base)\n",
    "\n",
    "    _log_base_func = partial(_log_base, base=base)\n",
    "    return df.transform_column(\n",
    "        column_name=column_name,\n",
    "        function=_log_base_func,\n",
    "        dest_column_name=dest_column_name,\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>first_name</th>\n",
       "      <th>last_name</th>\n",
       "      <th>employee_status</th>\n",
       "      <th>subject</th>\n",
       "      <th>hire_date</th>\n",
       "      <th>percent_allocated</th>\n",
       "      <th>full_time</th>\n",
       "      <th>certification</th>\n",
       "      <th>gratitude_points</th>\n",
       "      <th>gratitude_log</th>\n",
       "      <th>gratitude_base5</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Jason</td>\n",
       "      <td>Bourne</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>PE</td>\n",
       "      <td>2008-08-30</td>\n",
       "      <td>0.75</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Physical ed</td>\n",
       "      <td>10</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.430677</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Jason</td>\n",
       "      <td>Bourne</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Drafting</td>\n",
       "      <td>2008-08-30</td>\n",
       "      <td>0.25</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Physical ed</td>\n",
       "      <td>50</td>\n",
       "      <td>1.698970</td>\n",
       "      <td>2.430677</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Alicia</td>\n",
       "      <td>Keys</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Music</td>\n",
       "      <td>2001-08-15</td>\n",
       "      <td>1.00</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Instr. music</td>\n",
       "      <td>20</td>\n",
       "      <td>1.301030</td>\n",
       "      <td>1.861353</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Ada</td>\n",
       "      <td>Lovelace</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1975-05-01</td>\n",
       "      <td>1.00</td>\n",
       "      <td>Yes</td>\n",
       "      <td>PENDING</td>\n",
       "      <td>1000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>4.292030</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Desus</td>\n",
       "      <td>Nice</td>\n",
       "      <td>Administration</td>\n",
       "      <td>Dean</td>\n",
       "      <td>2013-06-06</td>\n",
       "      <td>1.00</td>\n",
       "      <td>Yes</td>\n",
       "      <td>PENDING</td>\n",
       "      <td>392</td>\n",
       "      <td>2.593286</td>\n",
       "      <td>3.710154</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Chien-Shiung</td>\n",
       "      <td>Wu</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Physics</td>\n",
       "      <td>1930-03-20</td>\n",
       "      <td>0.50</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Science 6-12</td>\n",
       "      <td>115</td>\n",
       "      <td>2.060698</td>\n",
       "      <td>2.948192</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>Chien-Shiung</td>\n",
       "      <td>Wu</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Chemistry</td>\n",
       "      <td>1930-03-20</td>\n",
       "      <td>0.50</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Science 6-12</td>\n",
       "      <td>12</td>\n",
       "      <td>1.079181</td>\n",
       "      <td>1.543959</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>James</td>\n",
       "      <td>Joyce</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>English</td>\n",
       "      <td>1990-05-01</td>\n",
       "      <td>0.50</td>\n",
       "      <td>No</td>\n",
       "      <td>English 6-12</td>\n",
       "      <td>182</td>\n",
       "      <td>2.260071</td>\n",
       "      <td>3.233431</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>Hedy</td>\n",
       "      <td>Lamarr</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>Science</td>\n",
       "      <td>1976-06-08</td>\n",
       "      <td>0.50</td>\n",
       "      <td>No</td>\n",
       "      <td>PENDING</td>\n",
       "      <td>1190</td>\n",
       "      <td>3.075547</td>\n",
       "      <td>4.400113</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>Carlos</td>\n",
       "      <td>Boozer</td>\n",
       "      <td>Coach</td>\n",
       "      <td>Basketball</td>\n",
       "      <td>2015-08-05</td>\n",
       "      <td>NaN</td>\n",
       "      <td>No</td>\n",
       "      <td>Physical ed</td>\n",
       "      <td>582</td>\n",
       "      <td>2.764923</td>\n",
       "      <td>3.955710</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>Young</td>\n",
       "      <td>Boozer</td>\n",
       "      <td>Coach</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1995-01-01</td>\n",
       "      <td>NaN</td>\n",
       "      <td>No</td>\n",
       "      <td>Political sci.</td>\n",
       "      <td>25</td>\n",
       "      <td>1.397940</td>\n",
       "      <td>2.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>Micheal</td>\n",
       "      <td>Larsen</td>\n",
       "      <td>Teacher</td>\n",
       "      <td>English</td>\n",
       "      <td>2009-09-15</td>\n",
       "      <td>0.80</td>\n",
       "      <td>No</td>\n",
       "      <td>Vocal music</td>\n",
       "      <td>317</td>\n",
       "      <td>2.501059</td>\n",
       "      <td>3.578207</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      first_name last_name employee_status     subject  hire_date  \\\n",
       "0          Jason    Bourne         Teacher          PE 2008-08-30   \n",
       "1          Jason    Bourne         Teacher    Drafting 2008-08-30   \n",
       "2         Alicia      Keys         Teacher       Music 2001-08-15   \n",
       "3            Ada  Lovelace         Teacher         NaN 1975-05-01   \n",
       "4          Desus      Nice  Administration        Dean 2013-06-06   \n",
       "5   Chien-Shiung        Wu         Teacher     Physics 1930-03-20   \n",
       "6   Chien-Shiung        Wu         Teacher   Chemistry 1930-03-20   \n",
       "7          James     Joyce         Teacher     English 1990-05-01   \n",
       "8           Hedy    Lamarr         Teacher     Science 1976-06-08   \n",
       "9         Carlos    Boozer           Coach  Basketball 2015-08-05   \n",
       "10         Young    Boozer           Coach         NaN 1995-01-01   \n",
       "11       Micheal    Larsen         Teacher     English 2009-09-15   \n",
       "\n",
       "    percent_allocated full_time   certification  gratitude_points  \\\n",
       "0                0.75       Yes     Physical ed                10   \n",
       "1                0.25       Yes     Physical ed                50   \n",
       "2                1.00       Yes    Instr. music                20   \n",
       "3                1.00       Yes         PENDING              1000   \n",
       "4                1.00       Yes         PENDING               392   \n",
       "5                0.50       Yes    Science 6-12               115   \n",
       "6                0.50       Yes    Science 6-12                12   \n",
       "7                0.50        No    English 6-12               182   \n",
       "8                0.50        No         PENDING              1190   \n",
       "9                 NaN        No     Physical ed               582   \n",
       "10                NaN        No  Political sci.                25   \n",
       "11               0.80        No     Vocal music               317   \n",
       "\n",
       "    gratitude_log  gratitude_base5  \n",
       "0        1.000000         1.430677  \n",
       "1        1.698970         2.430677  \n",
       "2        1.301030         1.861353  \n",
       "3        3.000000         4.292030  \n",
       "4        2.593286         3.710154  \n",
       "5        2.060698         2.948192  \n",
       "6        1.079181         1.543959  \n",
       "7        2.260071         3.233431  \n",
       "8        3.075547         4.400113  \n",
       "9        2.764923         3.955710  \n",
       "10       1.397940         2.000000  \n",
       "11       2.501059         3.578207  "
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.log_transform(\"gratitude_points\", base=5, dest_column_name=\"gratitude_base5\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Lessons Learned"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Lesson 1: Consistent interfaces lower contribution barrier"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## and low contribution barriers help build communities"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "scrolled": true,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "![](./friends.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "![](./sprints.jpg)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "Thanks Lucas!\n",
    "\n",
    "![](%0D%0ALS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoK%0D%0APHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHht%0D%0AbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0%0D%0AcDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJo%0D%0AdHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIw%0D%0AMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5l%0D%0AdC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3Nj%0D%0AYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iMTcwLjYyMzY3bW0iCiAgIGhl%0D%0AaWdodD0iMTg3LjM1NDQzbW0iCiAgIHZpZXdCb3g9IjAgMCAxNzAuNjIzNjggMTg3LjM1NDQzIgog%0D%0AICB2ZXJzaW9uPSIxLjEiCiAgIGlkPSJzdmczNzk0IgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjky%0D%0ALjQgNWRhNjg5YzMxMywgMjAxOS0wMS0xNCIKICAgc29kaXBvZGk6ZG9jbmFtZT0ibG9nby5zdmci%0D%0APgogIDxkZWZzCiAgICAgaWQ9ImRlZnMzNzg4IiAvPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAg%0D%0AICBpZD0iYmFzZSIKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2%0D%0ANjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5%0D%0APSIwLjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp6b29tPSIw%0D%0ALjczMTM5MDI5IgogICAgIGlua3NjYXBlOmN4PSIzNTkuMjgyIgogICAgIGlua3NjYXBlOmN5PSIz%0D%0ANTkuODAxMDUiCiAgICAgaW5rc2NhcGU6ZG9jdW1lbnQtdW5pdHM9Im1tIgogICAgIGlua3NjYXBl%0D%0AOmN1cnJlbnQtbGF5ZXI9ImxheWVyMSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgZml0LW1h%0D%0Acmdpbi10b3A9IjAuOSIKICAgICBmaXQtbWFyZ2luLWxlZnQ9IjAuOSIKICAgICBmaXQtbWFyZ2lu%0D%0ALXJpZ2h0PSIwLjkiCiAgICAgZml0LW1hcmdpbi1ib3R0b209IjAuOSIKICAgICBpbmtzY2FwZTp3%0D%0AaW5kb3ctd2lkdGg9IjE5MjAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iMTAyNiIKICAg%0D%0AICBpbmtzY2FwZTp3aW5kb3cteD0iMCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgICBp%0D%0AbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIiAvPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRh%0D%0AZGF0YTM3OTEiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91%0D%0AdD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAg%0D%0AICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2Rj%0D%0AbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlPjwvZGM6dGl0bGU+CiAgICAg%0D%0AIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgaW5rc2Nh%0D%0AcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBp%0D%0AZD0ibGF5ZXIxIgogICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xNy40OTc2NzksLTUuMjYzMzg4%0D%0AOCkiPgogICAgPHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7c3Ryb2tlOiMwMDAwMDA7%0D%0Ac3Ryb2tlLXdpZHRoOjAuMjY0NTgzMzI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGlkPSJwYXRo%0D%0AMzcyMyIKICAgICAgIGQ9Im0gMTgyLjI0NzM4LDI1LjQ1NjI5NyBjIC0zLjAyMzUxLC0xLjk0NTE1%0D%0AIC02LjE2ODU4LC0zLjcwNDQxIC05LjI4MDM3LC01LjUwNTk1IC0zLjMzNDMzLC0xLjk1NzY5IC02%0D%0ALjU3OTMyLC00LjA2MTUyIC05Ljg5MDM2LC02LjA1Nzc0IC0xLjQyNjcyLC0wLjc4MzY3IC0yLjc3%0D%0AODMzLC0xLjY5Njg3IC00LjIwMTExLC0yLjQ4NTkgLTAuNDI3NjIsLTAuMTQ3OTYgLTAuNzY3MSwt%0D%0AMC40NDg2NiAtMS4xNzk5NSwtMC42MjAzOSAtMC4zNjI3OSwwLjAyIC0wLjQzNTgxLC0wLjIyNjUx%0D%0AIC0wLjY4ODQsLTAuMzMwNTIgLTAuMzI2NzksLTAuMTEyOTUgLTAuMzg3NDQsLTAuMDU3NCAtMC42%0D%0ANjI1MiwtMC4zMzc2OSAtMC4xODc4OSwtMC4xMTYzMiAtMC4zNzI0OCwtMC4xMTYyNSAtMC41ODQx%0D%0ANCwtMC4xMzAxNjk5IC0wLjEzODYsLTAuMDEwOCAtMC4yNzUxNiwwLjAxMDMgLTAuNDEzNTQsMC4w%0D%0AMTQzIC0wLjE0OTM3LC0wLjIzNDU4ODUgLTAuMjc0MDcsLTAuMzE5NDg4NSAtMC41MTExOCwtMC40%0D%0AMTkwMDg1IC0wLjEwNTUsLTAuMDMxMiAtMC4xODAxNywwLjAyNzYgLTAuMzEzNywwLjAzNDkgLTIu%0D%0AMjY1NzksMC4yMjU3NSA2LjA4MDI5LC0zLjg5MTQ0IDQuNDI4MzQsLTIuNTE0IC0wLjAyNCwwLjA0%0D%0AMTcgLTAuMDM2NSwwLjA5MjYgLTAuMDcxOSwwLjEyNTEzIC0wLjA1MzcsMC4wNDkzIC0wLjEzNjY5%0D%0ALDAuMDU3MyAtMC4xOTIwNSwwLjEwNDcyIC0wLjEsMC4wODU3IC0wLjE3MTA0LDAuMjA1MzMgLTAu%0D%0AMjYxNDUsMC4zMDE4MSAtMC4zMDM5NSwwLjQ0NjQ4IC0wLjQ5NzM3LDAuOTMxMTkgLTAuNjUzNiwx%0D%0ALjQ0NDc5IC0wLjU2MzI4LDEuNzc3MjQ4NSAtMS4yODM2NywzLjUwMTA0ODUgLTEuOTgyNzYsNS4y%0D%0AMjgxMzg1IC0xLjMwOTIyLDMuMzc4NDYgLTIuODcxMjMsNi42NDQyNCAtNC41MTgwNiw5Ljg2ODU1%0D%0AIC0xLjgwMTgyLDMuNTY4MDIgLTMuNzU3NjgsNy4wNTUwNCAtNS42NTk1NiwxMC41NzAwNyAtMi4w%0D%0AMDk4LDMuNzQ3NDQgLTQuMTk3MDUsNy4zOTQ4IC02LjI5NTEzLDExLjA5MjM2IC0yLjAzODY4LDMu%0D%0ANTM4MTYgLTQuMTAxNzgsNy4wNjMxNiAtNi4yNDQ4OSwxMC41MzkzMyAtMi4xMzczMiwzLjI4Nzky%0D%0AIC00LjMwMzY5LDYuNTU1NTkgLTYuMzkxNTgsOS44NzU1OCAtMi4xMjI1MywzLjMwODY4IC00LjI2%0D%0ANTI4LDYuNjAyMzkgLTYuMjY4NDUsOS45ODUzNyAtMS42ODM1MiwyLjg3OTU4IC0zLjMyMzcsNS43%0D%0AODQzNCAtNC45NjQ4Myw4LjY4ODIzIC0xLjM1ODA5LDIuMzc2MDQgLTIuNjMxOTEsNC43OTc2MSAt%0D%0ANC4wMjM4NCw3LjE1NDI3IC0xLjAyOTcxLDEuNjY3NTYgLTIuMTIxNzQsMy4yOTMxMyAtMy4yNTg4%0D%0AOCw0Ljg4ODc1IC0wLjkxMzY2LDEuMjA0MzcgLTEuNTgwMTIsMi41NjA1IC0yLjMyMjcyLDMuODY5%0D%0ANDQzIC0wLjUwMjI5LDAuODkxNTQgLTEuMDAyMjgsMS43OTAzIC0xLjYxNzYxLDIuNjA5ODUgLTAu%0D%0ANDcxMjUsMC41OTc0MSAtMC45NTYzNCwxLjE4NDA3IC0xLjQ1MDY0LDEuNzYyNjMgLTAuODM1OSww%0D%0ALjk5NTM2IC0xLjY1Mzc0LDIuMDA1NjkgLTIuNDUxNiwzLjAzMTggLTEuMTc4ODksMS41NTUzMSAt%0D%0AMi4zMDM1MSwzLjE0OTU5IC0zLjQ5MzE4LDQuNjk3NSAtMS4zMTYyNCwxLjc0MjggLTIuNjUzNiwz%0D%0ALjQ2ODYzIC00LjA2NzUzLDUuMTMzNDIgLTEuMTIxMzQsMS4zNTI2MSAtMi4yNTUyMiwyLjY5NDMz%0D%0AIC0zLjQyNjEyLDQuMDA0MzkgLTAuNDM5MDYsMC41MjI5MiAtMC45NDYxNCwwLjk4NjA1IC0xLjM4%0D%0ANDg1LDEuNTA4NzEgLTAuMDQ2MiwtMC4yNzMxIC0wLjIzOTgxLC0wLjU2MTQ0IC0wLjEzODY5LC0w%0D%0ALjgxOTMxIDAuMDY5MSwtMC4xNzYwOCAwLjM1NTY3LC0wLjEyODg1IDAuNTM0NTgsLTAuMTkwMjEg%0D%0AMC45MjA0NCwtMC4zMTU2MyAxLjgzMjUxLC0wLjU1MzEgMi43OTA0NywtMC43MjI0OSAxLjQ4MzQ4%0D%0ALC0wLjE4MjIgMy4wMTIxLC0wLjA5ODEgNC40OTI4MywwLjA5MzkgMS4xOTUxMiwwLjA5NDYgMi4z%0D%0AMzkxNiwwLjM4OTA2IDMuNDcwNywwLjc2NTQyIDAuODUzNzUsMC4zMTk0NiAxLjY0MDEsMC43NzEy%0D%0AOSAyLjQxNDI4LDEuMjQ2OTYgMC43NTM1MiwwLjQ5OTM3IDEuNTA4MzUsMC45OTU2IDIuMjYyMjgs%0D%0AMS40OTQ2OSAwLjcwMjAzLDAuNDU5NzkgMS4zODE4MSwwLjk2MTQ3IDIuMDk2OTYsMS40MDA3NSAw%0D%0ALjY2NTE1LDAuNDQ1MjkgMS4zOTQ2MywwLjc3NjIzIDIuMDY3ODcsMS4yMDg3IDAuNjEyMTIsMC40%0D%0AMzU3NiAxLjI1MzM1LDAuODMwMjggMS44NTMwOCwxLjI4MzkzIDAuNTcyNDcsMC40MTcxMiAxLjAy%0D%0ANjM3LDAuOTU1MSAxLjUyOTQ5LDEuNDQ2NjEgMC40ODg1NSwwLjUyNjg1IDAuODQ1MTYsMS4xNTUx%0D%0ANyAxLjMxNDg2LDEuNjk2MiAwLjM5NTIsMC40ODYzOSAwLjc0NTU4LDEuMDEwNTIgMS4xNDk4OSwx%0D%0ALjQ4ODE1IDAuMjg0NSwwLjM2Njc3IDAuNjExMzIsMC43MTg3NCAwLjk1Mzc4LDEuMDMwNzcgMC4w%0D%0ANjYzLDAuMDYxMSAwLjE3NzY0LC0wLjEwOTkyIDAuMTk1MTYsLTAuMTAxMTUgMC4wNjExLDAuMDMw%0D%0ANiAwLjA3NzIsMC4xMjYzOCAwLjE0MjE4LDAuMTQ3NjcgMC4wNTU2LDAuMDE4MiAtMC4wMjMyLC0w%0D%0ALjEyNDUgMC4wMDUsLTAuMTc1NTQgMC4xMTM4NywtMC4wNTUgMC4wNTc2LC0wLjAxMTkgMC4xNDUw%0D%0AOSwtMC4xNTUzMyAtMS41MzgwNiwwLjg4OTEzIC0zLjA2NTgzLDEuNzk2MzIgLTQuNjE0MTksMi42%0D%0ANjc0IC0wLjA3NzEsMC4wNDM0IDAuMTMyODYsLTAuMTE3MjQgMC4xOTQzOCwtMC4xODA4OCAwLjE1%0D%0ANDQ4LC0wLjE1OTgxIDAuMjY5MzUsLTAuMzEyMjkgMC40MDc4NiwtMC40ODU4IDAuODc2MjEsLTEu%0D%0AMjEwMzEgMS44MDI1NCwtMi4zNzYyNyAyLjY0MDUyLC0zLjYxNTggMS43MjY2NywtMi44NDYxNyAz%0D%0ALjI4MjQ0LC01Ljc4ODM5IDUuMDM2MDIsLTguNjE4MjUgMS45NzMwNSwtMy4wMTYyIDQuMTA3Mzcs%0D%0ALTUuOTE3ODEgNi4wMzM2OCwtOC45NjUxNSAxLjg1NTcyLC0zLjEyMTQ4IDMuNjMxNDYsLTYuMjg2%0D%0ANCA1LjUzNjc4LC05LjM3ODQ2IDIuMDkxNTksLTMuMjE1OTEgNC4wMDE3NiwtNi41NDQxOTMgNS44%0D%0ANTg3MywtOS44OTk0NjMgMS43NDM0LC0zLjM3MzExIDMuNjg3NTIsLTYuNjMxNzYgNS42NjExMywt%0D%0AOS44NzMxMyAyLjAxOTU3LC0zLjExMzg5IDMuNjg5OTIsLTYuNDI2NjUgNS4yNjc1OSwtOS43ODAx%0D%0ANyAxLjI0MjUyLC0yLjg3OTE5IDIuNzEyODYsLTUuNjMwMDYgNC40MDYwNiwtOC4yNjYyNyAxLjYx%0D%0ANDk2LC0yLjM1NDg1IDMuMjAzMSwtNC43MjQ1NyA0LjU3NTAxLC03LjIzMDYxIDEuMTA1MzQsLTIu%0D%0AMTI5NSAxLjk0OTY5LC00LjM4MDQ2IDIuNzg1MzUsLTYuNjI1NTggMC43OTAwNSwtMi4xODAyOCAx%0D%0ALjgxODE1LC00LjI1NDYzIDIuODk4NzMsLTYuMzAxNzggMS4wNTMwNSwtMS44NzMwMyAyLjE1NjAz%0D%0ALC0zLjcxNzM1IDMuMTk0NjMsLTUuNTk4NTUgMS4wMjA3LC0xLjg2MTI0IDEuODc3NzEsLTMuODA2%0D%0ANjcgMi43NDkzMiwtNS43NDA2NyAwLjg4NjYxLC0yLjExNjY5IDEuNzczMDEsLTQuMjI2NzggMi43%0D%0AOTk0NCwtNi4yODAzNCAxLjMxODMsLTIuNDc2NyAzLjAwOTE3LC00LjcyNjUgNC41NjM5MiwtNy4w%0D%0ANTU0NSAwLjg3MzQ3LC0xLjI2NzE3IDEuNzAxODUsLTIuNTYzMzUgMi41NDE0MywtMy44NTI4IDAu%0D%0AMDU5MSwtMC4wODk4IDAuMTE4MTMsLTAuMTc5NTYgMC4xNzcyLC0wLjI2OTM0IDAsMCA1LjE1NjA3%0D%0ALC0yLjI0ODIyIDUuMTU2MDcsLTIuMjQ4MjIgdiAwIGMgLTAuMDY0NCwwLjA5MDQgLTAuMTI4Nzcs%0D%0AMC4xODA4NyAtMC4xOTMxNSwwLjI3MTMxIC0wLjg5NjQ4LDEuMjg5ODggLTEuNzMyNzYsMi42MjA2%0D%0ANyAtMi42NDg0MywzLjg5NzY3IC0xLjU1MDA4LDIuMzE1MzEgLTMuMjQxODMsNC41NDU4OCAtNC41%0D%0AODU3Miw2Ljk5MTI0IC0xLjAzNDE4LDIuMDM4ODggLTEuOTI5ODQsNC4xMzQ1MyAtMi43OTIwMiw2%0D%0ALjI1MTA5IC0wLjg3NTYsMS45NDAxIC0xLjcxMjcyLDMuOTAyNjggLTIuNzI0LDUuNzc2OTQgLTEu%0D%0AMDMxODIsMS44ODY4NCAtMi4xMjMsMy43MzkyMSAtMy4yMDkwOCw1LjU5NTE0IC0xLjA3NDgxLDIu%0D%0AMDMyNDYgLTIuMTQ0NjIsNC4wNjg3NiAtMi45Mjk3Niw2LjIzNjIzIC0wLjgzNTkzLDIuMjY5OTgg%0D%0ALTEuNjkzNDYsNC41NDAwOCAtMi43NzUzNSw2LjcwNjQzIC0xLjM1NDQxLDIuNTM0NyAtMi45Mzk5%0D%0ANSw0LjkyNjI0IC00LjU4MzY3LDcuMjgxODUgLTEuNzEwMDcsMi42MTYyNCAtMy4yMjM1MSw1LjMz%0D%0AMzMyIC00LjQ1OTkzLDguMjA4OTggLTEuNTc3MzcsMy4zNzM4MSAtMy4yNDg3NCw2LjcxMDE3IC01%0D%0ALjI2ODI1LDkuODQ1MjIgLTEuOTc0MzMsMy4yMzQyMiAtMy45MzI5NSw2LjQ3ODEzIC01LjY2NjU4%0D%0ALDkuODUwNDEgLTEuODU2MDIsMy4zNjA3NyAtMy43NTE2OSw2LjcwNDE4MyAtNS44NDc3Nyw5Ljky%0D%0AMjU2MyAtMS45MDM5OSwzLjA4OTYzIC0zLjY5NjkyLDYuMjQwMjkgLTUuNTIxNDUsOS4zNzY5NCAt%0D%0AMS45MTAzNCwzLjA1Njk0IC00LjAzMjU3LDUuOTY0MSAtNi4wMzE0NCw4Ljk2MjIzIC0xLjc2MjU3%0D%0ALDIuODA1MTkgLTMuMzMwNzQsNS43MTk5NCAtNC45NjY5Niw4LjU5OTY5IC0wLjc3OTAyLDEuMjQw%0D%0ANjEgLTEuNjM0MjQsMi40MTcwMiAtMi41MjMyMywzLjU3Njk5IC0xLjE2ODczLDEuOTk5OTUgLTMu%0D%0ANTA5NjYsMy42MTQ2MSAtNS43OTcwMywzLjgyMzQ0IC0wLjE2NjM5LC0wLjA0ODQgLTAuMDg1Mywt%0D%0AMC4wMDYgLTAuMjMyOTQsLTAuMTQ1NTcgLTAuMDI2NiwtMC4wMDggMC4wNDQ3LDAuMDczNSAwLjAx%0D%0AODEsMC4wODE1IC0wLjExNzg5LDAuMDM1IC0wLjM1NDA3LC0wLjIzODQ0IC0wLjQzMDY5LC0wLjI3%0D%0ANjg3IC0wLjMzMjA3LC0wLjM1MzYxIC0wLjY4NzkyLC0wLjY4ODY5IC0wLjk2ODM1LC0xLjA4Njgz%0D%0AIC0wLjM5MTIzLC0wLjQ4NzM4IC0wLjc1NzExLC0wLjk5NTA1IC0xLjE0NTg0LC0xLjQ4NSAtMC40%0D%0AMzk0LC0wLjU0MTY3IC0wLjgwMTQ2LC0xLjE0Mjg2IC0xLjI4MzE2LC0xLjY1MDMyIC0wLjQ4Mzgy%0D%0ALC0wLjQ3NDY2IC0wLjkyNjU3LC0wLjk5MTg1IC0xLjQ4ODMsLTEuMzgwOTQgLTAuNTk2NCwtMC40%0D%0AMzA4OSAtMS4yMTA4LC0wLjgzNjY5IC0xLjgxODY3LC0xLjI1MDg3IC0wLjY4OTQ0LC0wLjQxMDE3%0D%0AIC0xLjQxNTEyLC0wLjc1OTA5IC0yLjA3OTIzLC0xLjIxMTk2IC0wLjY5OTc0LC0wLjQ2NjczIC0x%0D%0ALjM5MjEzLC0wLjk0NDc2IC0yLjA5MTU5LC0xLjQxMTk3IC0wLjc1MTA1LC0wLjQ5MDgyIC0xLjQ5%0D%0AMjE1LC0wLjk5NjE4IC0yLjI1MTE2LC0xLjQ3NDg2IC0wLjc1MTEzLC0wLjQ0MTUyIC0xLjUwOTcs%0D%0ALTAuODY5OTggLTIuMzQwODMsLTEuMTQ2MDQgLTEuMDk4NjYsLTAuMzYwMDkgLTIuMjI2NSwtMC41%0D%0AODIwMiAtMy4zNzg4NywtMC42ODkyNSAtMS40NTYwNiwtMC4xNDE2MyAtMi45NDM3NiwtMC4yMzE3%0D%0ANSAtNC4zODk0NiwwLjA0MjggLTAuNzEwMzUsMC4xNTQyOSAtMS4zOTk0MiwwLjMzMTIxIC0yLjA4%0D%0ANzMsMC41Njg2MiAtMC4yMjE5OCwwLjA3NjYgLTAuNDQyNTUsMC4xNTczMyAtMC42NjE4OCwwLjI0%0D%0AMTIxIC0wLjE4NywwLjA3MTUgLTAuMzY0OTQsMC4yODE2NyAtMC41NTY5MywwLjIyNDkgLTAuMjkx%0D%0AMjQsLTAuMDg2MSAtMC40NjA2MywtMC4zOTU5NiAtMC42OTA5NSwtMC41OTM5NCAwLjU4MzM1LC0w%0D%0ALjE5NTIgMS4wMDU3NCwtMS4wNTgwMyAxLjQ5MTM5LC0xLjQxNzk0IDEuMjAzNjgsLTEuMzAyMDQg%0D%0AMi4zNjY3OCwtMi42NDAxNyAzLjQ4ODc4LC00LjAxMzQyIDEuNDI3MTQsLTEuNjQ3NTEgMi43Njkx%0D%0ALC0zLjM2MzA3IDQuMDc2NTIsLTUuMTA2ODggMS4xOTIwNiwtMS41MzE0MSAyLjMxMDcxLC0zLjEx%0D%0ANDM4IDMuNDU3MTEsLTQuNjc4MDQgMC43NzM5NywtMS4wMzM3NyAxLjU5NjMzLC0yLjAyNzcxIDIu%0D%0AMzkwMzEsLTMuMDQ1NDIgMC41MDUxNywtMC41NjcyNCAwLjk4NDA5LC0xLjE1NzUgMS40NTk5Miwt%0D%0AMS43NDU4MyAwLjY3NTg0LC0wLjc2NDcyIDEuMTg0MTcsLTEuNjU1MDEgMS42ODExMiwtMi41NDM2%0D%0ANSAwLjc4NjQyLC0xLjMwMzU1IDEuNDEzMzQsLTIuNzAxMTMgMi4zMjgxLC0zLjkyNjcxMyAxLjE0%0D%0AMTA5LC0xLjU5NzQ5IDIuMjY3MzIsLTMuMjAyMjkgMy4zMTQ2NSwtNC44NjQxNiAxLjQyMjAyLC0y%0D%0ALjM1MzY3IDIuNzIzMzksLTQuNzcyOTcgNC4wNzk4NywtNy4xNjQ1MiAxLjY0NTk0LC0yLjkxNzA3%0D%0AIDMuMzA2OTIsLTUuODI2MDMgNS4wMDA0MywtOC43MTU3NCAyLjAwMDQ4LC0zLjM5MzI1IDQuMTM5%0D%0ANTIsLTYuNjk3NTcgNi4yNzc5MSwtMTAuMDA0OSAyLjA3NTcyLC0zLjMyNjcxIDQuMjI2NjcsLTYu%0D%0ANjAyNzIgNi4zOTA5LC05Ljg3MjEyIDIuMTU2NTksLTMuNDcwMSA0LjIxNjUyLC02Ljk5OTEgNi4y%0D%0ANzMzNywtMTAuNTI4NzcgMi4wODUzMSwtMy42OTY0NiA0LjI3ODE1LC03LjMzMjM0IDYuMjgxODEs%0D%0ALTExLjA3NDkzIDEuODk2NDYsLTMuNTEzOTggMy44NTQ3NSwtNi45OTU3NCA1LjY2MDc2LC0xMC41%0D%0ANTc0NSAxLjYzODQxLC0zLjE5MjE1IDMuMjAxNzEsLTYuNDIyNjQgNC40NjAwNiwtOS43ODcwNiAw%0D%0ALjY3MTQyLC0xLjY5MTQ5IDEuMzQ4ODgsLTMuMzg3MjcgMS44ODM2OCwtNS4xMjcwNCAwLjE1OTIx%0D%0ALC0wLjUzNjQ2IDAuMjU0MjMsLTEuMDg3MzUgMC41NzE0MywtMS41NTgyNTg1IDAuMDQ5NiwtMC4x%0D%0AMjk4NSAwLjIzMjA3LC0wLjU0MjM0IDAuMzUwNDYsLTAuNjMwMzcgMC4wMzI3LC0wLjAyNDMgMC4w%0D%0AODEzLC0wLjAwNSAwLjEyMTk4LC0wLjAwNyAxLjIyMjIxLC0xLjY1Mjk0IDMuMzE2MjQsLTMuMTM3%0D%0AMTEgNS4zNzU3OCwtMi45ODEwMSAwLjE3MTk5LDAuMDIgMC4zMTQ2OCwwLjA2OTUgMC40NTUyLDAu%0D%0AMTczOTIgMC4wNzkyLDAuMDQ4NCAwLjQ4NTY4LDAuNDQxNzUgMC4zNTY0MSwwLjE5NSAwLjE1NzUs%0D%0AMC4wMDQgMC4zMTE1OSwwLjAyMzMgMC40NjQyOCwwLjA2NDEgMC4yNzkxOCwwLjA3MTIgMC41MzMw%0D%0AMiwwLjE5OTU3IDAuNzUzNDMsMC4zODcyIDAuMTc3MzksMC4wOTY3IDAuNDUyMTIsMC4wOTA0IDAu%0D%0ANjE0NiwwLjI2NjIgMC4yMDM0MywwLjE1NTIzIDAuNDMxMzEsMC4xNDI1MyAwLjY1NjIsMC4yODcw%0D%0ANyAwLjM5MDY4LDAuMjIyNTIgMC43NjgyMSwwLjQ2NjE3IDEuMTY3NjYsMC42NzQzMSAxLjM3MTcz%0D%0ALDAuODQ1MzcgMi43MDIyMywxLjc1Njk4ODUgNC4wOTMwMSwyLjU3MjI5ODUgMy4yNDUyMiwyLjA2%0D%0AMjc5IDYuNDY4NTcsNC4xNjM1MSA5Ljc5MDQ5LDYuMTAxOTYgMy4xNjEyLDEuODEyNjQgNi4zMzMz%0D%0AMiwzLjYwNjAxIDkuNTAxMDQsNS40MDYyNSAwLDAgLTQuNzE4NTMsMy4wMjEyMiAtNC43MTg1Mywz%0D%0ALjAyMTIyIHoiCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgogICAg%0D%0APHBhdGgKICAgICAgIHN0eWxlPSJmaWxsOiMwMDAwMDA7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdp%0D%0AZHRoOjAuMjY0NTgzMzI7c3Ryb2tlLW9wYWNpdHk6MSIKICAgICAgIGlkPSJwYXRoMzcyNyIKICAg%0D%0AICAgIGQ9Im0gMjIuOTQ4ODEsMTQ0LjUyNjM5IGMgNC44ODg3NiwtMC45NDEwMiA5LjY5ODg1LC0y%0D%0ALjI2NzU2IDE0LjUwMjUxLC0zLjU2NjM2IDcuODEyMDgsLTIuMjIxNTIgMTUuNDE1NTgsLTUuMTA5%0D%0AMzIgMjIuOTkwMzYsLTguMDIyODkgNi40NDc0MywtMi4zODA1NiAxMi42NzkyMywtNS4yNzUyMyAx%0D%0AOC44OTkzOCwtOC4xODM0NSAyLjg2NDUsLTEuNDI2MzkgNS43NzM0NSwtMi43NTc2OSA4LjY2NDc3%0D%0ALC00LjEyNzI4IDEuMTgzMTMsMi44NjU1MyAwLjU3NDgzLDAuNjc1OTkgLTUuNTgyMTksNC4yMjE4%0D%0ANiAtMC42NjY2NSwwLjM4MzkzIC0xLjMxNzUsMC44MDUyIC0yLjAyNTMsMS4xMDY2MSAtMC41Nzc1%0D%0ANywwLjI0NTk1IDIuMTY2NDEsLTEuMjY5MTUgMS42MzIzMiwtMC45MzkyNiAtMS4xNjU3OSwwLjcy%0D%0AMDA3IC0yLjM1MTkxLDEuNDA2NzIgLTMuNTI3ODYsMi4xMTAwOCAtMS4yOTc3MiwwLjgwODY2IC0y%0D%0ALjU5NTQ0LDEuNjE3MzEgLTMuODkzMTYsMi40MjU5NyAtOC40ODg5LDUuMTQ3ODggLTE2LjcyNzYy%0D%0ALDEwLjY5NzIzIC0yNC45MTMwNywxNi4zMTEzIC01LjMxNDI0LDMuNjU1NTkgLTEwLjUzNzgzLDcu%0D%0ANDQwMTUgLTE1LjcxMjUxLDExLjI5MDAxIC0xLjI5NTgyLDEuMDE2MzUgLTAuODk2NTQsMC42OTk3%0D%0ANSAtMi4wMzQxNSwxLjYwMzE5IC0wLjIwNjgyLDAuMTY0MjQgLTAuMzcwNjMsMC41ODAwNSAtMC42%0D%0AMjAwNSwwLjQ5MzIzIC0wLjI1NTc5LC0wLjA4OSAwLjA0MywtMC44NjgwMiAtMC4yMTQ0MiwtMC43%0D%0AODM3MSAtMS4yNDIzOSwwLjQwNjk3IC02LjYxODA0LDMuOTAyMTkgLTEuOTY1NTMsMC45MjUyNSA4%0D%0ALjM5MDgsLTUuNTIyNzEgMTcuMDI5MDIsLTEwLjYzODMxIDI1Ljg1NTk1LC0xNS40MzA4NCAxLjQ3%0D%0AOTE5LC0wLjc3NTA0IDIuOTU2ODIsLTEuNTUzMDUgNC40Mzc1NiwtMi4zMjUxMiAyLjEzMDE0LC0x%0D%0ALjExMDY2IDYuNTEzMDUsLTMuMzg4OTggOC42OTI3NiwtNC40NjYzMiAzLjg0OTIsLTEuOTAyNTIg%0D%0ANy43Njc5NywtMy42NTkyIDExLjY3Nzc5LC01LjQzMTg4IDQuNjc5NTksLTIuMTE4NiA5LjMzMjU0%0D%0ALC00LjI5MzMgMTMuOTM2MjUsLTYuNTcyMTQgMC4zNTUwMSwtMC4xNjg1IDAuNjcyMDcsLTAuNTA4%0D%0ANDUgMS4wNjUwMiwtMC41MDU1MSAwLjIxMDg3LDAuMDAyIDAuNDM1MjMsMC4zMTcwOSAwLjM2NTc0%0D%0ALDAuNTE2MTkgLTAuMTYyMjIsMC40NjQ3OCAtMC41NzY1OSwwLjgwNzcxIC0wLjk0MjY3LDEuMTM2%0D%0AODQgLTAuNjEzNywwLjU1MTc2IC0xLjMwNzk2LDEuMDA3MTkgLTEuOTc3OTcsMS40ODkwMiAtMC43%0D%0ANDY5LDAuNTM3MTIgLTUuNzg3NDIsNC4wMTIyMyAtNi4yOTIxMSw0LjM2MDc5IC03Ljk4MTkzLDUu%0D%0ANTgyODcgLTE1Ljk5ODU5LDExLjExODg4IC0yMy44ODg5NCwxNi44MzEwNSAtNS4xMzYyNiwzLjg1%0D%0ANTA1IC0xMC41ODI4NSw3LjI3MDE3IC0xNS43NTI0NCwxMS4wNzY4OSAtMC43NjEwNywwLjU5MzQ0%0D%0AIC0xLjUwODYsMS4xNTk1NCAtMi4yNDA4MiwxLjc4NTAzIC0wLjIyOTI3LDAuMTk1ODUgLTAuMzg2%0D%0ANDYsMC41MDczNiAtMC42NzEyNywwLjYwNjQgLTAuMTE1NDYsMC4wNDAxIC0wLjAxMywtMC4yNDQx%0D%0ANCAtMC4wMTk1LC0wLjM2NjIxIDAuMjU3OCwtMC4yMjQ4MyAxLjA4ODI5LC0wLjgwODA3IDAuNzcz%0D%0AMzksLTAuNjc0NSAtMS4wMDk4LDAuNDI4MzEgLTEuOTI3MDUsMS4wNDgzNCAtMi44OTA1NywxLjU3%0D%0AMjUxIDYuNjUxMzgsLTQuNDk2NTkgMTIuODE5OTcsLTkuNjU3MTcgMTkuMTQyOTMsLTE0LjU5NDM2%0D%0AIDYuMzYwNjQsLTUuMTEwNCAxMy4wOTUyOCwtOS43MTcyNiAxOS43Mjc2MywtMTQuNDU5OTcgMS45%0D%0AMjcwOCwtMS40MTc5NyAzLjkwNjkyLC0yLjc2Mjc4IDUuODQyMDgsLTQuMTY5NDIgMC40MDMxNiwt%0D%0AMC4yOTMwNSAwLjc5OTMzLC0wLjU5NTYxIDEuMTk4MzYsLTAuODk0MjcgMC4zMDM1NCwtMC4yMjcx%0D%0AOSAwLjU1NDc3LC0wLjU0OSAwLjkwOTM0LC0wLjY4MzI4IDEuMzc2OTIsLTAuNTIxNDcgMi44MjE1%0D%0AOCwtMC44NDI2NiA0LjIzMjM3LC0xLjI2Mzk5IC01LjYxNDE4LDQuOTAzMTkgLTExLjI3ODg5LDku%0D%0ANzQ4NDggLTE2Ljk5MzU5LDE0LjUzNDM3IC02LjMxOTUxLDUuNDc4ODYgLTEyLjY0MTMzLDEwLjk1%0D%0AMTUxIC0xOC44MTMyNCwxNi41OTY1NiAtMi44MTg4NiwyLjcyMDkzIC01LjY0MTgxLDUuNDU3Mjkg%0D%0ALTguMjE5MzcsOC40MTIyNCAtMC4zNDM3MywwLjA4NzQgMC42NTU1MSwtMC44NTUzOCAwLjM5MDEz%0D%0ALC0wLjc1NTY4IC0xLjE1ODA2LDAuNDM1MDUgLTIuMDYwOTYsMS40Mjk0NSAtMy4yMzU0MSwxLjgx%0D%0AODA5IC0wLjgzMTQ5LDAuMjc1MTUgMS40NjEwMywtMC45NjY2NSAyLjE3ODg1LC0xLjQ2ODQ2IDIu%0D%0ANDk1NjcsLTEuNzQ0NjcgMy40Mjg4NywtMi40ODgwNCA1LjkyOTgzLC00LjM3NjM5IDcuNDEyMywt%0D%0ANS42NzE4NSAxNC4zNzcwMSwtMTEuODg4ODIgMjEuMTQyMzUsLTE4LjMwOTMzIDQuOTM1NDgsLTQu%0D%0ANjIyNTQgOS40NjUzOCwtOS42NDMgMTQuMDg5NjMsLTE0LjU2ODQ0IDIuMDU2OTQsLTIuMTk4MjYg%0D%0AMi45NTI2NywtNC4wNzI4NCA2LjczNDQsLTQuMDU1MjEgMC43NDQ3MSwwLjAwMyAtMS4wOTU4Mywx%0D%0ALjAwOTI4IC0xLjYyNDIzLDEuNTM0MDcgLTAuNzMzOSwwLjcyODg4IC0xLjQ0MTIxLDEuNDg0MDUg%0D%0ALTIuMTYxODEsMi4yMjYwOCAtNi41OTcxNCw2LjkwMjAyIC0xMi42MDgzOCwxNC4zMTk2MyAtMTgu%0D%0ANTczNCwyMS43NjQ0NiAtNC40MzU2OCw1LjY4MTQ0IC04LjQ2ODI0LDExLjY1OTc2IC0xMi42Nzgz%0D%0AMywxNy41MDcyOSAtMC4xMTcxNiwwLjE1NTc3IC0xLjg4ODc2LDIuNTEzNjYgLTIuMTM4MzksMi44%0D%0AMzY5NSAtMC4yNDI5MiwwLjMxNDYxIC0wLjM2MDkyLDAuODE5MDcgLTAuNzQxNDUsMC45MzM4OSAt%0D%0AMC4yMjE5NSwwLjA2NyAwLjE2NTY3LC0wLjc2MDYgLTAuMDU2MSwtMC42OTMyMiAtMS4zMDM0LDAu%0D%0AMzk1ODcgLTIuMzA1OTIsMS42NTc1MyAtMy42NTgyMiwxLjgyMTM4IC0wLjgyMzIsMC4wOTk3IDEu%0D%0AMjY1MzQsLTEuMDcyMDcgMS44OTgwMSwtMS42MDgxMSA2LjA5NDgsLTUuMjk3NTUgMTEuODg3NTEs%0D%0ALTEwLjkyMjcxIDE3LjYzNTQxLC0xNi41OTAxOCA1LjczMjAxLC01LjcwNzIzIDEwLjk5NzcsLTEx%0D%0ALjg2MzA3IDE1LjkxODk0LC0xOC4yNzY3NCAyLjc5NTI5LC0zLjY5MDM5IDUuMjk2NzYsLTcuNjEx%0D%0AOCA3LjIzMjc0LC0xMS44MjEzMiAwLjEyNTU3LC0wLjMwNSAwLjI1MTE0LC0wLjYxIDAuMzc2NzEs%0D%0ALTAuOTE1IC0wLjAyMSwwLjExMjI5IC0wLjE3MDU5LDAuMzc1NTQgLTAuMDYzMSwwLjMzNjg3IDEu%0D%0AMzQ4NzgsLTAuNDg1MiAyLjUwNzAzLC0xLjgzMzM5IDMuOTM2NzMsLTEuNzMwMzIgMC44MjA4LDAu%0D%0AMDU5MiAtMS4wNzUzNywxLjI0NzE4IC0xLjU3NTcxLDEuOTAwNTMgLTEuNTkyNzMsMi4wNzk3OSAt%0D%0AMi45NTYzOSw0LjE4MzI2IC00LjQyNTMyLDYuMzYwMSAtNS44NDg1Niw4Ljg5OTU5IC0xMC44Mzk0%0D%0AMywxOC4zMzExOCAtMTUuNzY5OTYsMjcuNzYwMDUgLTMuMDU3MjMsNi4wMTIyMiAtNS45MTA0OCwx%0D%0AMi4xMjU4OSAtOC43NjMxNSwxOC4yMzcxMiAtMS4zNjIzLDIuODQ4MzIgLTEuNDE1MzIsMy40ODg2%0D%0ANCAtNi4wNDg2OCw0LjI0NTAxIC0wLjU1NzA3LDAuMDkwOSAwLjU3MTk1LC0wLjk3MzM4IDAuODY4%0D%0AMywtMS40NTM3NiAxLjE3NzE4LC0xLjkwODI0IDIuMzg3OTUsLTMuNzk1NTUgMy41ODMzNywtNS42%0D%0AOTI0MSA1Ljc2ODcxLC04LjgyNzAxIDExLjkwOTM4LC0xNy4zOTQwOSAxOC4xMzg4OCwtMjUuODk4%0D%0ANzUgNS4xODQzNywtNy4wNzk3NyAxMC42NjA0MiwtMTMuOTM4MTMgMTUuODkxMjgsLTIwLjk4Mjg4%0D%0AIDAuNDk3NzcsLTAuNzA5OTUgMS4wMDExMiwtMS40MTYwMiAxLjQ5MzI5LC0yLjEyOTg2IDAuMzg5%0D%0AMjYsLTAuNTY0NTUgMC43NzQyOSwtMS4xMzIxIDEuMTUwOSwtMS43MDUxNiAwLjI4Nzk3LC0wLjQz%0D%0AODE2IDAuNTUxNjMsLTAuODkyMDYgMC44NDI2NCwtMS4zMjgyMSAwLjEwMzQxLC0wLjE1NDk3IDAu%0D%0AMTY2MjEsLTAuMzc1OTMgMC4zMzk2OCwtMC40NDM4MiA1Ljc2NTEyLC0yLjI1NjEzIDUuNTYwODUs%0D%0ALTMuMDQzOTkgNC4xMjY4NSwwLjIzMzAxIC0zLjgyNzA0LDguMjc0MTEgLTcuODE1MjksMTYuNDcx%0D%0ANiAtMTEuNzE1NjQsMjQuNzExMDggLTMuNzE1MDcsOC4wMDMyNiAtNy4zOTg0NSwxNi4wMjEyNCAt%0D%0AMTEuMTI2NTMsMjQuMDE4NDQgLTEuMzk5MDYsMi45NjY2NyAtMi44MDExNiw1LjkzMjE1IC00LjE0%0D%0AMzE2LDguOTI1MiAtMC43MTQyMSwxLjg5NTk3IC0wLjQxNTk1LDEuNDM1MTIgLTQuNzkxMjcsMi4y%0D%0AODUwOSAtMC41MzQ5MiwwLjEwMzkyIDAuNzk1OTYsLTAuNzQ4MjIgMS4xNDU2NywtMS4xNjYxMSAy%0D%0ALjExNjMzLC0yLjUyODkyIDMuNzcxODYsLTUuNDM0NjQgNS40NzcwMiwtOC4yMzk5NSA1LjA0MDUy%0D%0ALC04LjI4MDMxIDguNzA3MjQsLTE3LjI4MDM2IDEyLjI3ODcxLC0yNi4yNjIzIDIuMTQ0MTYsLTUu%0D%0ANDczNjkgNC4yMDkzNywtMTAuOTg3MzggNS44NDczNCwtMTYuNjM3MjQgMC42NDI4NCwtMi4yMTcz%0D%0ANCAwLjk5OTYsLTMuNzQ4MzYgMS41NDMxOSwtNS45NTA5MiAwLjQxMDA4LC0xLjc0ODkzIDAuNzgy%0D%0AOTIsLTMuNTA3MzggMS4wNzAyOSwtNS4yODA5NiAwLjA1MjEsLTAuMzIxNjMgMC4wOTc1LC0wLjY0%0D%0ANDMyIDAuMTQyMDMsLTAuOTY3MDggMC4wMjg3LC0wLjIwOCAtMC4xMDc5NywtMC41MjY3MyAwLjA3%0D%0ANzUsLTAuNjI1MTEgMS41ODY1MywtMC44NDE0OCAzLjMxOTY1LC0xLjM3MTM2IDQuOTc5NDcsLTIu%0D%0AMDU3MDMgLTEuMzc5NTUsNy41OTQxOSAtMy4wNzc3OCwxNS4xMjUyOCAtNC42NzA5NCwyMi42NzYz%0D%0AOSAtMi4xNTU3NSwxMC41NzgxNSAtNC4wMTU3OCwyMS4yMTMxNyAtNS45Mzc1OCwzMS44MzUzOCAt%0D%0AMS4wODMwOSw1LjY4OTUzIC0yLjE3NjA2LDExLjM3OTI0IC0zLjQ2MDU0LDE3LjAyNzM3IC0wLjEw%0D%0AMTM1LDAuNDMxMzIgLTAuMjAzMjksMC44NjI1IC0wLjMwNDAyLDEuMjkzOTYgLTAuMjMzMDgsMC45%0D%0AOTgzIC0wLjE5NDcsMC44MzU3NyAtMC4zOTI3MywxLjcyMDUzIC0wLjAzNDYsMC4xNTQ1OSAwLjAz%0D%0ANzEsMC4zOTE1MiAtMC4xMDM4NCwwLjQ2Mzc1IC01LjYxMDg1LDIuODc0NTUgLTUuNDE3MjcsMy44%0D%0AMDE3OSAtNC42ODE4NiwwLjcwMjAxIDIuMTA1MDksLTcuOTE0MSA0LjI0MjYsLTE1LjgxNjM5IDYu%0D%0ANTM5NTcsLTIzLjY3NzE3IDIuMzM2ODksLTcuNjk5MzYgNC42NzMzOCwtMTUuNDE1NzggNi4zMDQ5%0D%0ALC0yMy4zMDI1MyAwLjI3NTQ2LC0xLjMzMTU1IDAuNTAzNTMsLTIuNjcyNDcgMC43NTUzLC00LjAw%0D%0AODY5IDAuODU0MDgsLTQuOTAyMDcgMS4zMjc2MywtOS44NjA3MiAxLjQ2MjIzLC0xNC44MzI1OCAw%0D%0ALjAyODYsLTIuODQ2NjIgLTAuNzMwOTQsLTMuMjc0OTIgNS4wMDE1NSwtMy42NTA0OSAwLjU0NTA0%0D%0ALC0wLjAzNTcgLTAuMDAyLDEuMDkyNDIgLTAuMDAzLDEuNjM4NjQgLTUuM2UtNCwwLjg1NzIyIC0y%0D%0AZS00LDEuNzE0NDQgLTIuNmUtNCwyLjU3MTY2IC0wLjIxOTQ4LDkuOTcwMjIgLTAuMjQ4NSwxOS45%0D%0ANDA3MiAtMC4xMjgxNywyOS45MTIyNSAwLjMxMjI2LDExLjExNzgyIDAuNjk3ODMsMjIuMjM0Mjgg%0D%0AMS4wODI1LDMzLjM1MDA3IDAsMCAtNC40NzAzMSwyLjI5MTcxIC00LjQ3MDMxLDIuMjkxNzEgdiAw%0D%0AIGMgLTAuMTY3OTMsLTExLjE0NzUyIC0wLjY2NDMzLC0yMi4yODQzNiAtMC45Mzk2NCwtMzMuNDI5%0D%0AMTQgLTAuMTYwMTMsLTkuODk5MTEgLTAuMTY4MDMsLTE5Ljc5ODczIC0wLjI4MTgyLC0yOS42OTgw%0D%0ANCAtMC4wMzY5LC0wLjgzNTgxIC0wLjA2NTQsLTEuNjcyMDMgLTAuMTEwODIsLTIuNTA3NDEgLTAu%0D%0AMDI4NCwtMC41MjEwOSAtMC40ODM4NCwtMS4xOTY5NCAtMC4xMTA1OSwtMS41NjE2NiA1Ljg0MDY5%0D%0ALC01LjcwNzEzIDQuOTU3NywtNC4zNzA0NSA0Ljg1MzM3LC0xLjM4NDUyIC0wLjI5MzEyLDUuMDUx%0D%0AMTcgLTAuODUwOTgsMTAuMDg2MzkgLTEuNzU5MjEsMTUuMDY2MSAtMC4yNjE5NSwxLjM0NzUzIC0w%0D%0ALjUwMDY0LDIuNjk5OCAtMC43ODU4Nyw0LjA0MjYgLTEuNjc4ODQsNy45MDM1NyAtNC4wMzY5Mywx%0D%0ANS42NDEyOCAtNi4zNzM3OSwyMy4zNjg1MyAtMi4yMzM2OCw3Ljc1NzE0IC00LjM2MTYxLDE1LjU0%0D%0ANTM1IC02LjEwNDg5LDIzLjQyOTgxIC0wLjYwNDY0LDMuMDgyOTIgMC4wMzg0LDEuNTcxNiAtNS4z%0D%0AMDYyNCw0LjA5MzY0IC0wLjE0ODIxLDAuMDY5OSAwLjA5OCwtMC4zMTI4MyAwLjE0MTkxLC0wLjQ3%0D%0AMDczIDAuMjgzNzMsLTEuMDIwNzQgMC41MjMwMywtMi4wNTM3OCAwLjgxNjMyLC0zLjA3MTk5IDEu%0D%0ANDc3MDYsLTUuNjc2NjMgMi42NTU0MywtMTEuNDI1ODcgMy44MjUyLC0xNy4xNzIwNiAyLjA1NzI2%0D%0ALC0xMC42MjM5MyAzLjk1ODgsLTIxLjI3NzQgNi4wNDIwNiwtMzEuODk2MzUgMS40OTcxOCwtNy40%0D%0AMDk0IDMuMTc4MTEsLTE0LjgwNTAxIDQuMDc5MDIsLTIyLjMxNjk4IDEuNjg0NDMsLTAuOTY4NDIg%0D%0AMy4yODU3OCwtMi4wOTg0MSA1LjA1MzMxLC0yLjkwNTI3IDAuMjAwOTUsLTAuMDkxNyAtMC4wNzgx%0D%0ALDAuNDM0ODIgLTAuMTE3NjMsMC42NTIxNiAtMC4zOTA4OSwyLjE1MDk5IC0wLjg2MTAxLDQuMjg2%0D%0AMDIgLTEuNDE5NDEsNi40MDAyNiAtMC41NjI0MSwyLjEyODg1IC0xLjAxNDUzLDMuOTA1ODIgLTEu%0D%0ANjU1NDIsNi4wMzQ1IC0xLjcwOTA0LDUuNjc2NDEgLTMuODEzNDMsMTEuMjIyMzUgLTUuOTc1MDQs%0D%0AMTYuNzM4NzUgLTMuNTQ2MjksOC45NzE2MyAtNy4xOTQ2OCwxNy45NTQxNiAtMTIuMTE3ODIsMjYu%0D%0AMjc3ODggLTEuNzM3MDgsMi45ODE4MiAtMS45MzQ2LDMuNDIyNzggLTMuNzI1OTIsNi4xNDU5OSAt%0D%0AMC40NTY5MiwwLjY5NDYgLTAuOTIzMDIsMS4zODM2NyAtMS40MTIxNSwyLjA1NTk4IC0wLjMwNzc4%0D%0ALDAuNDIzMDUgLTAuNTIzNjQsMC45Njc0MSAtMC45NzcxNywxLjIyODE5IC0xLjc5MzIyLDEuMDMx%0D%0AMDYgLTMuNzEwNTksMS44NDQyNyAtNS42NDQyMiwyLjU3ODk3IC0wLjE2NTk4LDAuMDYzMSAwLjEx%0D%0AODYzLC0wLjMzNDY5IDAuMTc3OTUsLTAuNTAyMDQgMS40NzM0OCwtMy4wMzEgMi45NjYyNCwtNi4w%0D%0ANTIwNSA0LjQ1OTkzLC05LjA3MzI1IDMuODc5NjYsLTguMDA0MzIgNy42MzUzMiwtMTYuMDY3ODgg%0D%0AMTEuMzgzNzMsLTI0LjEzNDI5IDMuODQwNzksLTguMTI5NzMgNy43NjM4NCwtMTYuMjI0NSAxMS4y%0D%0AOTYwMiwtMjQuNDk1MjcgMS40MjkwNCwtMy41MTU5MiAwLjIxNTY1LC0xLjU1MTYyIDUuOTUxNDQs%0D%0ALTQuNjIxMzggMC4xODg1MywtMC4xMDA4OSAtMC4zODIzMiwwLjIxMzggLTAuNTE2NzQsMC4zODAw%0D%0AOSAtMC4zNDMwMSwwLjQyNDMzIC0wLjU5MDY1LDAuOTE3NzMgLTAuODk3MjEsMS4zNjkxIC0wLjg3%0D%0AMzM5LDEuMjg1OTYgLTEuODc4NjUsMi42NjUwNSAtMi43NzgyLDMuOTE3NjEgLTUuMzU3NDIsNy4w%0D%0ANTg1MSAtMTAuOTIxMjEsMTMuOTU4NzkgLTE2LjE3MjMzLDIxLjA5ODE5IC02LjIwNDY5LDguNDM0%0D%0AMTkgLTEyLjMxNDQ3LDE2LjkzNzI3IC0xNy45NDUzOCwyNS43NzAwOCAtMS4wODQ0NCwxLjc5NTQg%0D%0ALTIuMjY1OTUsMy43MjI4NiAtMy4zMTc2Nyw1LjU1NjAyIC0wLjI0ODk2LDAuNDMzOTUgLTAuMzAx%0D%0AOCwxLjA0Mzg1IC0wLjcyMTU4LDEuMzE2MDQgLTEuNjA0NiwxLjA0MDQzIC0zLjM1MzE5LDEuODg0%0D%0ANDYgLTUuMTYzNzksMi41MDAwNiAtMC43NzA1NiwwLjI2MTk5IDIuMzQzOTMsLTIuNzY0ODcgMS4x%0D%0ANTY3MSwtMi4xNTAyOSAzLjA2MzAxLC02LjE0NjQ3IDYuMDU5MDgsLTEyLjMyNjI1IDkuMTc4ODcs%0D%0ALTE4LjQ0NDIzIDQuOTQ4ODYsLTkuMzg4NjMgOS45MDY0OCwtMTguODAwNjUgMTUuNjIzMDYsLTI3%0D%0ALjc1MDQzIDEuNjYzNjcsLTIuNTYzNjggMi40ODQzOSwtMy44ODc4MiA0LjE3ODM0LC02LjI5NzU1%0D%0AIDAuNDU1LC0wLjY0NzI2IDAuNzcxMDUsLTEuNDM4NTcgMS40MDMyLC0xLjkxNDM0IDEuODA4ODMs%0D%0ALTEuMzYxMzggMy43NzI0NiwtMi41MzA5NSA1LjgxMTEzLC0zLjUxNTM2IDAuMTk3NSwtMC4wOTU0%0D%0AIDAuNDE4NTEsMC4yODczMyAwLjQxOTc5LDAuNTA2NjUgMC4wMDIsMC4zNDYxNiAtMC4yNzQxOSww%0D%0ALjYzNTczIC0wLjQxMTI4LDAuOTUzNTkgLTIuMDI2NDUsNC4yODE3OCAtNC42MDUxOSw4LjI3OTYx%0D%0AIC03LjQ2NDY1LDEyLjA1MTIzIC00Ljk1NTAyLDYuNDQ1MDIgLTEwLjI0ODc5LDEyLjYzNjk1IC0x%0D%0ANi4wMDE0MiwxOC4zODc0OSAtNS42ODE0OCw1LjYxNzA5IC0xMS40MDY0NCwxMS4xODk4OCAtMTcu%0D%0AMzY0NzksMTYuNTE1MzcgLTIuNzI5NzksMi40MzAyNiAtMy4zMzI0LDMuMTQ5MjQgLTcuNjYzMjIs%0D%0ANS4yMTg1MyAtMC4yMzUyNywwLjExMjQxIC0wLjU3NTkyLC0wLjMxNzQ0IC0wLjUzMTA4LC0wLjU3%0D%0ANDMgMC4wNzA1LC0wLjQwMzk0IDAuNTM2ODIsLTAuNjIwMTggMC43OTUyLC0wLjkzODU4IDAuMzM4%0D%0ANiwtMC40MTcyNiAwLjY2MzY5LC0wLjg0NTMgMC45OTU0MywtMS4yNjgwNCAwLjQxOTQsLTAuNTM0%0D%0ANDUgMC44Mzg2NCwtMS4wNjkwMSAxLjI1Nzk2LC0xLjYwMzUxIDQuMzUyOTgsLTUuODcxOTUgOC40%0D%0AOTcxMSwtMTEuODk2NDIgMTIuOTg3NTIsLTE3LjY2NTQ0IDUuOTI3NjUsLTcuMzgxMjIgMTEuODc2%0D%0AMjUsLTE0Ljc1MDE2IDE4LjMxMTc2LC0yMS43MDA2IDAuNjgwNTksLTAuNzMyNiAxLjM1MTk3LC0x%0D%0ALjQ3Mzg2IDIuMDQxNzgsLTIuMTk3NzkgMC40Nzk2NywtMC41MDMzOSAwLjg2Njg0LC0xLjEzMTMy%0D%0AIDEuNDY2MjQsLTEuNDgzNzQgOS4xNDQ4NiwtNS4zNzY1NyA1LjkzMTkyLC0yLjk3ODI5IDMuMzM0%0D%0ALC0wLjEwNzQ1IC00Ljc2MjY5LDQuOTM0NjUgLTkuMzU3MjcsMTAuMDM2MzggLTE0LjM3ODU3LDE0%0D%0ALjcxNjQ3IC02Ljc0MzEyLDYuNDA0NTMgLTEzLjY3MDY5LDEyLjYxOTcyIC0yMS4wMjUsMTguMzIx%0D%0ANTMgLTIuNzI1LDIuMDkxMTIgLTMuMDg5NzEsMi40MDI4NiAtNS43NTEyNCw0LjMzMTU0IC0wLjY4%0D%0AMDg0LDAuNDkzMzcgLTEuMzQwNjEsMS4wMTk5NCAtMi4wNTc4MSwxLjQ1ODc4IC0yLjAzNDc5LDEu%0D%0AMjQ1MDUgLTQuMDQxMTcsMi41NTYxMiAtNi4xOTE1MywzLjU4ODgyIC0wLjMyNDE2LDAuMTU1Njgg%0D%0ALTAuNzQ5ODYsMC4wNTU4IC0xLjA3NDIyLC0wLjA5OTUgLTAuMTM0NDEsLTAuMDY0MyAtMC4wMzk1%0D%0ALC0wLjI5NTM5IC0wLjA1OTMsLTAuNDQzMDkgMi42NTQzLC0zLjAzNjU0IDUuNjM1MDEsLTUuNzgw%0D%0AMDYgOC41MTE0NiwtOC41OTk5MSA2LjIzMTMzLC01LjY1MzQ2IDEyLjYwMTk2LC0xMS4xNDUzNiAx%0D%0AOC45NDQ4NiwtMTYuNjcyOTQgNS41OTg2MywtNC42OTIxMiAxMS4xNTY2MywtOS40MzY4OCAxNi41%0D%0ANzA1OCwtMTQuMzQxMTIgMS45OTYzMywtMC45NTA2OSAzLjk1NTgxLC0xLjk4Mjk1IDUuOTg4OTcs%0D%0ALTIuODUyMDcgMC4zNjMzLC0wLjE1NTI5IC0wLjYzODI2LDAuNDY1ODEgLTAuOTU1OTksMC43MDA2%0D%0ANCAtMi4zODk1MywxLjc2NjA4IC00Ljg1MDk3LDMuNDMwMDYgLTcuMjYzNzcsNS4xNjQzMyAtNi42%0D%0AOTIwNiw0Ljc1MTMzIC0xMy40OTI1Nyw5LjM1ODg1IC0xOS44OTU5LDE0LjUwMjYyIC02LjI0MTk5%0D%0ALDQuODczODYgLTEyLjMyOSw5Ljk1OTQ4IC0xOC44MDkzMiwxNC41MTgxOSAtMi4xNDcxNCwxLjI3%0D%0AMzE2IC00LjI0MTk3LDIuNjM4OTYgLTYuNDQxNDIsMy44MTk0NyAtMC4zNjMyMiwwLjE5NDk1IC0w%0D%0ALjc5ODkxLDAuMzYxOTcgLTEuMjAzNjgsMC4yODM4OCAtMC4yMjYxOCwtMC4wNDM2IC0wLjQyNTQ0%0D%0ALC0wLjM2NDIxIC0wLjM2NTMzLC0wLjU4NjU4IDAuMDgzMywtMC4zMDgwOSAwLjQ1ODY1LC0wLjQ0%0D%0ANDQzIDAuNzAwMzYsLTAuNjUyODQgMC41OTk1NCwtMC41MTY5NSAxLjc2MzU2LC0xLjQwNzA0IDIu%0D%0AMzM2NTUsLTEuODUyNzggNS4yNjI0OSwtMy44NjcxOSAxMC44MzUzOSwtNy4yOTI0NyAxNi4wNjY1%0D%0ANiwtMTEuMjA1NzcgNy44Nzc5NywtNS42OTU0OSAxNS44ODk1OCwtMTEuMjAzMjcgMjMuODI1OTIs%0D%0ALTE2LjgxNjgyIDAuMDM0NiwtMC4wMjQxIDUuNzA3MTksLTMuOTc5NDIgNi4wODM1LC00LjI1MzYg%0D%0AMC42MjY3NiwtMC40NTY2NiAxLjE5NDAzLC0wLjk5NTMgMS44NDMyNywtMS40MTkzOCAwLjMyOTY5%0D%0ALC0wLjIxNTM1IDAuNjg5NjQsLTAuNDExODYgMS4wNzYwOSwtMC40ODc1MiAwLjExODE3LC0wLjAy%0D%0AMzEgMC4zNzMwOCwwLjEzNzggMC4yODU4OSwwLjIyMDg2IC0wLjI3Mjc4LDAuMjU5ODYgLTAuNjgx%0D%0AODEsMC4zMjA3MiAtMS4wMjI3MiwwLjQ4MTA3IC00LjUzMDcsMi4xODYxMSAtOS4wOTc1NCw0LjI5%0D%0ANDMyIC0xMy42ODczMiw2LjM1MzYxIC04LjM2OTA5LDMuNzcyNDUgLTE2LjYyOTA2LDcuNzY2NCAt%0D%0AMjQuNjg2MDEsMTIuMTczNzcgLTEuNDIyMDksMC43NzY2NyAtMi44Mzk2NSwxLjU2MTY2IC00LjI2%0D%0ANjI1LDIuMzMwMDEgLTAuMDU1NSwwLjAyOTkgMC4yMDUxMiwtMC4xNDY2MiAwLjE1MTI3LC0wLjEx%0D%0AMzc0IC00LjMxOTcsMi42Mzc1NiAtOC42MDM3NSw1LjMzMjQgLTEyLjgyODE1LDguMTIwMzcgLTIu%0D%0AMTgyMjQsMS40MjAwNCAtNS43MjQwMywzLjc1OTEgLTcuNDc4NjcsNC41MzAxOCAtMC4yNTQyMyww%0D%0ALjExMTcyIC0wLjU1MDY2LC0wLjM3ODE2IC0wLjUxNjQyLC0wLjY1Mzc0IDAuMDM0MywtMC4yNzYw%0D%0AOSAwLjQ0MDc4LC0wLjMzOTU5IDAuNjYwOTgsLTAuNTA5NjIgMS4yMDc3NiwtMC45MzI1NCAwLjc2%0D%0AOTc3LC0wLjU5Mzc0IDIuMTM0MDIsLTEuNjU5NjMgNS4zMDIwOCwtMy44ODMxMiAxMC42NDA1Miwt%0D%0ANy43MTcyMSAxNi4wNTM4MiwtMTEuNDQ0MjMgOC4xODE3LC01LjYwOTQyIDE2LjQxNjE3LC0xMS4x%0D%0ANTU2NSAyNC44ODU4NSwtMTYuMzIzMTEgNC44NDQwNCwtMy4wNTAyNSA5LjY4Mjk2LC01LjkxNzIz%0D%0AIDE0LjY1NDM4LC04Ljc3OTEgMC43MDc0OSwtMC40MDcyNyAyLjgxNjE2LC0xLjY0OTU4IDIuMTM1%0D%0AMzMsLTEuMTk5MTcgLTMuNjY0NywyLjQyNDQgLTQuNjE0OTEsMS4xNjQ4MyAtMy4wMzkyMywyLjY4%0D%0AODExIC0yLjgzMDU2LDEuMjkzNDMgLTUuNjUyODksMi42MDIyNSAtOC40NTM3NiwzLjk1OTQ5IC02%0D%0ALjE4NDQzLDIuODY2NTcgLTEyLjM5Mjc1LDUuNjg5MDMgLTE4Ljc5MTk4LDguMDUyNDYgLTcuNjAx%0D%0AOTMsMi45MDUyIC0xNS4yMzEyNiw1Ljc4MjQ0IC0yMy4wNjM1OSw4LjAxMzkgLTQuOTMyNjIsMS4z%0D%0ANDU0OSAtOS44NjUzOSwyLjcxODAxIC0xNC44NjcwNiwzLjc4NjAzIDAsMCA0LjQ3MTA3LC0zLjM3%0D%0AMjkyIDQuNDcxMDcsLTMuMzcyOTIgeiIKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1%0D%0AcmU9IjAiIC8+CiAgPC9nPgo8L3N2Zz4K)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "![](./readthedocs.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# How to make sprints beginner-friendly: (Some Opinions)™️"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Require first-time sprint contributions to be docs. 1/4\n",
    "\n",
    "1. Docs contributions don't break the codebase: less intimidating.\n",
    "1. Docs contributions enforce familiarity with the library.\n",
    "1. Everybody is treated equally, without regard to experience.\n",
    "\n",
    "Don't reject any docs PR based on size."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Celebrate every merged PR! 2/4\n",
    "\n",
    "Announce the merged contribution to the large group!\n",
    "\n",
    "1. Keeps everybody motivated, enhances the tangible feel of progress being made.\n",
    "1. If too disruptive, batch PRs and announce less frequently, but not less emphatically!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Encourage sharing the load 3/4\n",
    "\n",
    "Some sprinters are either:\n",
    "\n",
    "1. Naturally more adept, or \n",
    "1. Carry prior experience.\n",
    "\n",
    "Let them mentor those who encounter issues."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Don't compromise on code standards 4/4\n",
    "\n",
    "1. Good standards helps level up beginner coders!\n",
    "1. Guide newcomers on how to write code that conforms to your standards.\n",
    "1. Leverage your CI system to ensure code style and test coverage are maintained."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Lesson 2: Languages don't have to be at war"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "## The R package `janitor` is the original\n",
    "\n",
    "![](./twitter-wars.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Good ideas can, and should, be shared"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Other `pyjanitor` features"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Domain-specific submodules"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "### Bioinformatics-oriented"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sequence_accession</th>\n",
       "      <th>sequence</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>HM628693</td>\n",
       "      <td>MKTIIALSYILCLVFAQKLPGNDNSTATLCLGHHAVPNGTIVKTIT...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>HM628694</td>\n",
       "      <td>MKTIIALSYILCLVFAQKLPGNDNSTATLCLGHHAVPNGTIVKTIT...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>KT889256</td>\n",
       "      <td>MKTIIALSYILCLVFAQKIPGNDNSTATLCLGHHAVPNGTIVKTIT...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>KC882982</td>\n",
       "      <td>MKTIIALSYILCLVFAQKLPGNDNSTATLCLGHHAVPNGTIVKTIT...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>KT841229</td>\n",
       "      <td>MKTIIALSYILCLVFAQKLPENDNSTATLCLGHHAVPNGTIVKTIT...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  sequence_accession                                           sequence\n",
       "0           HM628693  MKTIIALSYILCLVFAQKLPGNDNSTATLCLGHHAVPNGTIVKTIT...\n",
       "1           HM628694  MKTIIALSYILCLVFAQKLPGNDNSTATLCLGHHAVPNGTIVKTIT...\n",
       "2           KT889256  MKTIIALSYILCLVFAQKIPGNDNSTATLCLGHHAVPNGTIVKTIT...\n",
       "3           KC882982  MKTIIALSYILCLVFAQKLPGNDNSTATLCLGHHAVPNGTIVKTIT...\n",
       "4           KT841229  MKTIIALSYILCLVFAQKLPENDNSTATLCLGHHAVPNGTIVKTIT..."
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sequences = (\n",
    "    pd.read_csv(here() / \"tests/test_data/sequences.tsv\", sep=\"\\t\")\n",
    "    .clean_names(strip_underscores=True)\n",
    "    .remove_empty()\n",
    "    .select_columns([\"sequence_accession\"])\n",
    "    .join_fasta(\n",
    "        here() / \"tests/test_data/sequences.fasta\",\n",
    "        id_col=\"sequence_accession\",\n",
    "        column_name=\"sequence\",\n",
    "    )\n",
    ")\n",
    "sequences.head(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "### Cheminformatics-oriented"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>smiles</th>\n",
       "      <th>mols</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>TR000</td>\n",
       "      <td>ClC(Cl)Cl</td>\n",
       "      <td>&lt;rdkit.Chem.rdchem.Mol object at 0x1a24150a80&gt;</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>TR001</td>\n",
       "      <td>C12(Cl)C3(Cl)C(=O)C4(Cl)C1(Cl)C5(Cl)C(Cl)(Cl)C...</td>\n",
       "      <td>&lt;rdkit.Chem.rdchem.Mol object at 0x1a24150f30&gt;</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>TR002</td>\n",
       "      <td>C(Cl)=C(Cl)Cl</td>\n",
       "      <td>&lt;rdkit.Chem.rdchem.Mol object at 0x1a24150c10&gt;</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>TR003</td>\n",
       "      <td>CC(Cl)(Cl)Cl</td>\n",
       "      <td>&lt;rdkit.Chem.rdchem.Mol object at 0x1a26703120&gt;</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>TR004</td>\n",
       "      <td>S=P(OC)(OC)SCC(=O)NC</td>\n",
       "      <td>&lt;rdkit.Chem.rdchem.Mol object at 0x1a267030d0&gt;</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      id                                             smiles  \\\n",
       "0  TR000                                          ClC(Cl)Cl   \n",
       "1  TR001  C12(Cl)C3(Cl)C(=O)C4(Cl)C1(Cl)C5(Cl)C(Cl)(Cl)C...   \n",
       "2  TR002                                      C(Cl)=C(Cl)Cl   \n",
       "3  TR003                                       CC(Cl)(Cl)Cl   \n",
       "4  TR004                               S=P(OC)(OC)SCC(=O)NC   \n",
       "\n",
       "                                             mols  \n",
       "0  <rdkit.Chem.rdchem.Mol object at 0x1a24150a80>  \n",
       "1  <rdkit.Chem.rdchem.Mol object at 0x1a24150f30>  \n",
       "2  <rdkit.Chem.rdchem.Mol object at 0x1a24150c10>  \n",
       "3  <rdkit.Chem.rdchem.Mol object at 0x1a26703120>  \n",
       "4  <rdkit.Chem.rdchem.Mol object at 0x1a267030d0>  "
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "smiles = (\n",
    "    pd.read_csv(here() / \"tests/test_data/corrected_smiles.txt\", sep=\"\\t\", header=None)\n",
    "    .remove_empty()\n",
    "    # Freely mix-and-match pandas and pyjanitor.\n",
    "    .rename({0: \"id\", 1: \"smiles\"}, axis=\"columns\")\n",
    "    .smiles2mol(smiles_column_name=\"smiles\", mols_column_name=\"mols\")\n",
    ")\n",
    "smiles.head(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>...</th>\n",
       "      <th>2038</th>\n",
       "      <th>2039</th>\n",
       "      <th>2040</th>\n",
       "      <th>2041</th>\n",
       "      <th>2042</th>\n",
       "      <th>2043</th>\n",
       "      <th>2044</th>\n",
       "      <th>2045</th>\n",
       "      <th>2046</th>\n",
       "      <th>2047</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 2048 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   0     1     2     3     4     5     6     7     8     9     ...  2038  \\\n",
       "0   0.0   1.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0  ...   0.0   \n",
       "1   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0  ...   0.0   \n",
       "2   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0  ...   0.0   \n",
       "3   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0  ...   0.0   \n",
       "4   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0  ...   0.0   \n",
       "\n",
       "   2039  2040  2041  2042  2043  2044  2045  2046  2047  \n",
       "0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0  \n",
       "1   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0  \n",
       "2   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0  \n",
       "3   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0  \n",
       "4   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0  \n",
       "\n",
       "[5 rows x 2048 columns]"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "morgans = smiles.morgan_fingerprint(mols_column_name=\"mols\")\n",
    "morgans.head(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# We can do more!\n",
    "\n",
    "Come sprint with us :)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "## We want...\n",
    "\n",
    "- Other labelled ndarray (`xarray`/`dask`/`vaex`) integrations!\n",
    "- Domain-specific tools\n",
    "- Your useful functions\n",
    "- Improved documentation & examples\n",
    "- Your simple or fantastical ideas!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Office Hours\n",
    "\n",
    "- Today, 3:30 pm-5:00 pm\n",
    "- Tomorrow, 2:00 pm-5:00 pm\n",
    "\n",
    "Tejas room."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "# With Thanks\n",
    "\n",
    "@szuckerman\n",
    "@zbarry\n",
    "@JoshuaC3\n",
    "@HectorM14\n",
    "@zsailer\n",
    "@cduvallet\n",
    "@shantanuo\n",
    "@jcvall\n",
    "@CWen001\n",
    "@bhallaY\n",
    "@jekwatt\n",
    "@kurtispinkney\n",
    "@lphk92\n",
    "@jonnybazookatone\n",
    "@SorenFrohlich\n",
    "@dave-frazzetto\n",
    "@dsouzadaniel\n",
    "@Eidhagen\n",
    "@mdini\n",
    "@kimt33\n",
    "@jack-kessler-88\n",
    "@NapsterInBlue\n",
    "@jk3587\n",
    "@ricky-lim\n",
    "@catherinedevlin\n",
    "@StephenSchroed\n",
    "@Rajat-181\n",
    "@dendrondal"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Slideshow",
  "kernelspec": {
   "display_name": "base",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.16"
  },
  "rise": {
   "enable_chalkboard": true,
   "scroll": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
